RE:Working Precision

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

```Richard Fateman showed how arbitrary precision arithmetic can produce
strange results.  I have some more strange behavior.
Richard demonstrated that  (x == x+1)  returns True after evaluating the Do
loop below. Well you can also get f[x] defined for lots of values you don't
expect!

In[1]:=
x=1.11111111111111111111;
Do[x=2*x-x, {100}];
Clear[f];
f[x]=29;
{f[-5.2],f[-2.1],f[4.3],f[8.2]}

Out[5]=
{f[-5.2],29,29,f[8.2]}

-------------------------------

The way to fix this problem is to change the value of \$MinPrecision as I do
below. Then my definition for (f) doesn't apply to f[-2.1], f[4.3]. This
will also ensure  (x==x+1)  returns False. I haven't checked but a positive
value for \$MinPrecision might solve the problem Bernd Brandt had with
NIntegrate.

In[6]:=
\$MinPrecision=1.0;
x=1.11111111111111111111;
Do[x=2*x-x, {100}];
Clear[f];
f[x]=29;
{f[-5.2],f[-2.1],f[4.3],f[8.2]}

Out[11]=
{f[-5.2],f[-2.1],f[4.3],f[8.2]}

---------------------------
Now consider another example. Below Mathematica thinks (b1) has much better
precision than (a1). This doesn't make sense, and Mathematica doesn't do
much better using the default setting (\$MinPrecision=0.0).

In[12]:=
a1=Exp[800.0]/Exp[800];
b1=a1+p-1;
SetOptions[Precision,Round->False];
(* Precision only has an option in Version 4. *);
{Precision[a1],Precision[b1]}

Out[15]=
{13.0515,25.2788}

The result above comes out much better if \$MinPrecision is much less than
zero. However, I can't understand why (b1) below still has slightly better
precision than (a1).

In[16]:=
\$MinPrecision=-Infinity;
a1=Exp[800.0]/Exp[800];
b1=a1+p-1;
{Precision[a1],Precision[b1]}

Out[19]=
{13.0502,13.5473}

----------------------------------
Well, (\$MinPrecision=-Infinity) allows a better result from the last
example, but now the definitions for (f) that I considered earlier are even
more strange.

In[20]:=
x=1.11111111111111111111;
Do[x=2*x-x, {100}] ;
Clear[f];
f[x]=29;
{f[-534.2],f[-2.1],f[4.3],f[815.2]}

Out[25]=
{29,29,29,29}

----------------------
A very good discussion of arbitrary precision arithmetic can be found in the
Help Browser under:
Getting Started/Demos
Demos
Numerics Report (near the bottom)

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