numerical accuracy & sorting problem
- To: mathgroup@smc.vnet.net
- Subject: [mg11951] numerical accuracy & sorting problem
- From: Wouter Meeussen <w.meeussen.vdmcc@vandemoortele.be>
- Date: Fri, 10 Apr 1998 01:03:41 -0400
hi all, I have encountered a problem that can be illustrated by: In[129]:=ohla=Sort[raw] Out[129]= {{-0.948683, 2., 4}, {0., 3.16228, 1}, {0.316228, 3., 2}, {0.316228, 2., 3}, {1., 0., 5}, {1., 3.16228, 6}} at this point, the Sort puts {0.316228, 3., 2} before {0.316228, 2., 3}. so, it must be that both "0.316228" values are slightly different. but when I test this, it doesn't turn out so: In[108]:=ohla[[{3,4}]] Out[108]={{0.316228, 3., 2}, {0.316228, 2., 3}} In[65]:={a,b}=First/@ % Out[65]={0.316228, 0.316228} In[96]:=a===b Out[96]=True Further experiments are even more confusing. At full precision, N[raw,40] shows no differences, turning the output-cell into an input cell, copying & pasting as new input and sorting that makes the problem go away: In[116]:= Sort[{{0.3162277660168379, 2., 3}, {-0.9486832980505138, 2., 4}, {1., 0., 5}, {0., 3.162277660168379, 1}, {0.3162277660168379, 3., 2}, {1., 3.162277660168379, 6}}] Out[116]= {{-0.948683298050514, 2., 4}, {0., 3.162277660168379, 1}, {0.3162277660168379, 2., 3}, {0.3162277660168379, 3., 2}, {1., 0., 5}, {1., 3.162277660168379, 6}} At a loss as to how to proceed, I came up with a trick that *seems* to work for now: add 10 and subtract 10. from the argument in question : In[132]:= raw={10+ang[pts[[Take[hull,-2] ]] , pts[[#]] ]-10., norm[(pts[[ Last[hull] ]] -pts[[#]])] ,indices[[#]] } &/@idx Is this guaranteed always to work? is there a more elegant way? baffled as always, wouter. below this line are sufficient data to reconstruct the whole thing: ------------------------------------------------------------------- (*** functions used ***) In[1]:= myOrdering[z_List]:=(Sort[Transpose[{z,Range[Length[z]]}]]//Transpose) [[2]] In[2]:= norm[vec_List]:=Sqrt[vec.vec] In[3]:= bary[pts_]:=1/Length[pts] Plus@@pts In[5]:= ang[{v1_List,v2_List},v2_|v1_]:=1. ang[{v1_List,v2_List},v3_List]:=(v2-v1).(v3-v2)/norm[v2-v1]/norm[v3-v2] (*** start short routine ***) In[31]:= pts=N@{{-2, -2, 0}, {-2, -2, 1}, {-2, -1, 1}, {-2, 1, -1}, {-2, 1, 1}, {-2, 2, -2}} cen=bary[pts] In[34]:= dis=norm[#-cen]& /@ pts idx=myOrdering[ dis] xfar=Last[idx] far=pts[[xfar]] In[38]:= xsec=Sort[{ ang[{cen,far},pts[[#]] ] , norm[(far-pts[[#]])] ,# }&/@idx ][[-2,-1]] Out[50]={6, 5} hull={xfar,xsec} raw1={ ang[pts[[Take[hull,-2] ]] , pts[[#]] ] , norm[(pts[[ Last[hull] ]] -pts[[#]])] ,indices[[#]] } &/@idx Sort[raw1] raw2={10+ang[pts[[Take[hull,-2] ]] , pts[[#]] ]-10., norm[(pts[[ Last[hull] ]] -pts[[#]])] ,indices[[#]] } &/@idx Sort[raw2] NV Vandemoortele Coordination Center Oils & Fats Applied Research Prins Albertlaan 79 Postbus 40 B-8870 Izegem (Belgium) Tel: +/32/51/33 21 11 Fax: +/32/51/33 21 75 vdmcc@vandemoortele.be