MathGroup Archive 2000

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

Search the Archive

RE: RE:Working Precision

  • To: mathgroup at smc.vnet.net
  • Subject: [mg24047] RE: [mg23928] RE:Working Precision
  • From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
  • Date: Wed, 21 Jun 2000 02:20:07 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

I want to clear up some things.
The only problem I have with the examples based on 
 
   x=1.11111111111111111111;
   Do[x=2*x-x, {100}];

is that a message is never posted warning that the results are not reliable
due to lose of precision in the value of (x). I suspect many users would
want to know when arbitrary precision arithmetic gives results with very low
precision.

------------------------
I also thought members of the MathGroup would 
be interested to know that a definition for 
   f[x]
apply to a wide range of values when (x) is a numeric value with precision
near zero and even more so when (x) has negative precision. I didn't mean to
suggest that this is a bug. I agree the results are correct.
  
-------------------------
Now lets take another look at a new variation of my second example using the
default setting of $MinPrecision.


In[1]:=
lst={Pi, Sqrt[2], 11, -10.749999999999999`4.28, -0.25`20};
b1=Plus@@lst

Out[2]=
4.55580621596289


In[3]:=
Precision[b1]

Out[3]=
15


How could we know the value of (b1) with 15 decimal places of precision when
the value of 
  -10.7499 .... 
is only good to 4.28 decimal places?

(*------------------------------*)

I suspect it is possible to write a Plus routine that would give the answer
I expect in cases like the one above (without needing  $MinPrecision <0 ). I
suggest that when 
evaluating Plus[args__] and all of the following are True
  1)  None of (args) are machine precision
  2)  Each args is numeric
  3)  One or more of (args) is arbitrary precision
  4)  Length[{args}]>2
then we should be sure not to add terms with opposite sign until everything
else is added together.  The method below seems to work well. 


In[4]:=
quad1 = Select[lst, (0 <= Arg[#1] < Pi/2)& ]; 
quad2 = Select[lst, (Pi/2 <= Arg[#1] < Pi)& ]; 
quad3 = Select[lst, (Pi <= Arg[#1] < 3*Pi/2)& ]; 
quad4 = Complement[lst, quad1, quad2, quad3];
a1=Complement[Accuracy/@lst,{Infinity}];
accur=Min[Max[a1],Min[a1]+100];
q1=quad1/.z_?(Accuracy[#]===Infinity&):>SetAccuracy[z,accur];
q2=quad2/.z_?(Accuracy[#]===Infinity&):>SetAccuracy[z,accur];
q3=quad3/.z_?(Accuracy[#]===Infinity&):>SetAccuracy[z,accur];
q4=quad4/.z_?(Accuracy[#]===Infinity&):>SetAccuracy[z,accur];
b1=Plus@@{Plus@@q1,Plus@@q2,Plus@@q3,Plus@@q4}

Out[14]=
4.556


In[15]:=
Precision[b1]

Out[15]=
4


Of course I would like to see something like this built-in to the kernel's
(Plus) routine where it would be transparent to the user and run much
faster.  Perhaps I overlooked something when I came up with the above
method. In any case I think this is a step in the right direction.

--------------------
Regards,
Ted Ersek

Download Mathematica tips, tricks at 
http://www.verbeia.com/mathematica/tips/Tricks.html


  • Prev by Date: Re: RE:Working Precision
  • Next by Date: Re: imposing side conditions on Solve
  • Previous by thread: Re: RE:Working Precision
  • Next by thread: Re: RE:Working Precision