MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Issues with machine number consistency in 7

  • To: mathgroup at smc.vnet.net
  • Subject: [mg94768] Issues with machine number consistency in 7
  • From: budgemano <mdalpiaz at email.arizona.edu>
  • Date: Tue, 23 Dec 2008 07:01:07 -0500 (EST)

We have code that is designed to perform a ray trace calculation and compare the results to a look up table. This worked great in 6, but once we switched to 7 things stopped working. Running the code numerous times produces slightly different results in a seemingly random fashion, though on the machine level it seems. A snippet of the code that does this is below (and it looks messy here I know), and it is only linear algebra type calculations, so nothing iterative I would think. The question is: how does this produce slightly different results with each run, and even more so what happened between 6 and 7 that makes this happen?

 And yes the accuracy is most likely fine, in that a few parts per quadrillion is not a big deal, but I would like to understand the reason before just slapping a bandage on the problem.

CreatSP[n_, k_] := Module[{nhat, khat, s, shat, p, phat},
     nhat = n/Norm[n];
     If[k == {0, 0, 0}, khat = k, khat = k/Norm[k]];
     If[Norm[Cross[nhat, khat]] == 0,(*if rays||normal,
    pick arbitrarily*)
       If[khat == {0, 0, 1} || khat == {0, 0, -1}, 
     s = Cross[khat + {0, 1*^-15, 0}, nhat], 
         s = Cross[khat + {0, 0, 1*^-15}, nhat]], 
    s = Cross[khat, nhat]];
     shat = s/Norm[s];
     p = Cross[khat, shat];
     If[p == {0, 0, 0}, phat = p, phat = p/Norm[p]];
     {shat, phat}];

JonesTo3D[
   j_] := {{j[[1, 1]], j[[1, 2]], 0}, {j[[2, 1]], j[[2, 2]], 0}, {0, 
    0, 0}};

GlobalToLocal[n_, k_] := Module[{shat, phat, nhat, khat},
     nhat = n/Norm[n];
     If[k == {0, 0, 0}, khat = k, khat = k/Norm[k]];
     {shat, phat} = CreatSP[nhat, khat];
     Return[{shat, phat, khat}]];

KReflect[n_, k_] := Module[{vs, vpl, nhat, khat},
     If[n == {0, 0, 0}, nhat = n, nhat = n/Norm[n]];
     If[k == {0, 0, 0}, khat = k, khat = k/Norm[k]];
     If[nhat == khat || nhat == -khat, -k,
       (*else*){vs, vpl} = 
         CreatSP[khat, nhat];(*feed the vectors in reverse order,
       to get s& p projected on the surface*)
       Dot[k, vpl]*vpl - 
    Dot[k, n]*n   (*output k vector*)]  (*end if*)
     ]

Reflect3D[n_, kin_, j_] := Module[{kout},
    kout = KReflect[n, kin];
    Transpose[GlobalToLocal[n, kout]].JonesTo3D[j].GlobalToLocal[n, 
        kin]
    ]

Surf3DReflect[n_, kin_, j_] := {KReflect[n, kin], 
     Reflect3D[n, kin, j]}; 

SetArithmetic[4, RoundingRule -> RoundToEven] ;
nhat = {0.186658373151350784576457645764576, \
-0.908774534497317234675674568458, 
    0.3732124022345396456745768874687} // N;
kIn = {0.5018839897852984567457648, 0.544293499215831476457645674576, 
   0.67220312964800834576456745674567};
J = {{-4.094099334937029435673467356734 + 
     1.474574404164915678487487 I, -1.10844925387366011246358345623 - 
     5.4374686620520058634643181 I}, \
{8.179637040999307235787945456132 + 2.51644639657543619834750187643 I,
     2.331233134964963234512765301876094 - 
     7.360368412868619230947509283762 I}};

For[ii = 1, ii <= 20, ii++,
 If[
   Surf3DReflect[nhat, kIn, J] =!= Surf3DReflect[nhat, kIn, J]
   ,
   Print["Iteration " <> ToString[ii] <> " fails comparison "]
   ];
 ]


  • Prev by Date: Re: Re: Display of Alternatives Symbol in Notebooks in Version 7
  • Next by Date: Keyboard Shortcuts in V7
  • Previous by thread: Re: A problem with derivative InterpolatingFunction from NDSolve
  • Next by thread: Keyboard Shortcuts in V7