Re: Union & precision <<take 2>>
- To: mathgroup at smc.vnet.net
- Subject: [mg8706] Re: [mg8627] Union & precision <<take 2>>
- From: Allan Hayes <hay at haystack.demon.co.uk>
- Date: Fri, 19 Sep 1997 02:47:47 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Gadi Oron <oron at manet.pmmh.espci.fr> [mg8627] Union & precision <<take 2>> Wrote as below the line *********** Gadi, Here are two possible alternative - though they does not use your test. lst ={Circle[{0.192450089729875202`,0.277777777777777767`}, 0.0555555555555555535`], Circle[{0.192450089729875202`,0.722222222222222232`}, 0.0555555555555555535`], Circle[{0.192450089729875308`,0.277777777777777901`}, 0.0555555555555555802`]}; (1) Union[lst/.x_Real:>0.00001 Round[10000 x]] {Circle[{0.19245,0.27778},0.05556], Circle[{0.19245,0.72222},0.05556]} (2) This gives the original forms Last/@Union[{#/.x_Real:>0.00001Round[100000x],#}&/@lst, SameTest->(#[[1]]===#2[[1]]&)] {Circle[{0.19245,0.277778},0.0555556], Circle[{0.19245,0.722222},0.0555556]} The problem with testing for sameness being between adjacent entries after sorting (Carl Woll,[mg8669] ) shows up simply in Union[{1[2],3[2],2[1]}, SameTest ->(#1[[1]]===#2[[1]]&)] {1[2],2[1],3[2]} Allan Hayes hay at haystack.demon.co.uk http://www.haystack.demon.co.uk/training.html voice:+44 (0)116 2714198 fax: +44 (0)116 2718642 Leicester, UK ************ Hello again, This is the second chapter im my adventure of trying to use Union taking into account the precision. As suggested by the replies to my last message (thanx) the use of SameTest-> testfunc should do the thing. Since my sets contain only one of the two structures "eline[{x1,y1},{x2,y2}]" and "Circle[{x,y},r]" I wrote the following: pre=10^(-4); norm[v_List]:=Sqrt[v.v]; Clear[test]; test[lhs_Circle,rhs_Circle]:= (norm[lhs[[1]]-rhs[[1]]]<pre && Abs[lhs[[2]]-rhs[[2]]]<pre ); test[lhs_eline , rhs_eline]:= (norm[lhs[[1]]-rhs[[1]]]<pre && norm[lhs[[2]]-rhs[[2]]]<pre); test[lhs_,rhs_]:=TrueQ[(lhs==rhs)]; Now, it seems to work all right: Check : test[Circle[{0.192450089729875202`,0.277777777777777767`}, 0.0555555555555555535`], Circle[{0.192450089729875308`,0.277777777777777901`}, 0.0555555555555555802`]] Gives : True. Also : Union[{Circle[{0.192450089729875202`,0.277777777777777767`}, 0.0555555555555555535`], Circle[{0.192450089729875308`,0.277777777777777901`}, 0.0555555555555555802`]},SameTest->test] Gives (right): {Circle[{0.19245,0.277778},0.0555556]} But (surprise): Union[{Circle[{0.192450089729875202`,0.277777777777777767`}, 0.0555555555555555535`], Circle[{0.192450089729875202`,0.722222222222222232`}, 0.0555555555555555535`], Circle[{0.192450089729875308`,0.277777777777777901`}, 0.0555555555555555802`]},SameTest->test] Gives (!!) : {Circle[{0.19245,0.277778},0.0555556],Circle[{0.19245,0.722222},0.0555556], Circle[{0.19245,0.277778},0.0555556]} Notice that the set is not well ordered and that we have 2 of the element equal by the SameTest. What is going wrong?? Thank you. P.S. Sorry for the illisibility, I have put in the full form of the numbers in order to show the precision. /\/\/\/\/\/\/\/\/\/\/\/>> Gadi ORON <<\/\/\/\/\/\/\/\/\/\/\/\/\ | EMAIL : oron at pmmh.espci.fr :::: oron at clipper.ens.fr | | Homepage : http://pmmh.espci.fr/~oron/personal.html | | fido : 2:325/302.8 | | Soyez braves - be brave. | /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/