Re: When Is Precision[ ] $MachinePrecision, And When Is It Not?
- To: mathgroup at smc.vnet.net
- Subject: [mg47467] Re: When Is Precision[ ] $MachinePrecision, And When Is It Not?
- From: drbob at bigfoot.com (Bobby R. Treat)
- Date: Tue, 13 Apr 2004 06:26:19 -0400 (EDT)
- References: <c5dhrd$nqp$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Machine precision (on my machine, at least) is 53 bits:
Log[2, 10^$MachinePrecision]
53.
The default display for machine precision numbers is just 6 digits;
that's why NumberForm (or other intervention) is needed to see more.
Notice that NumberForm counts base ten digits, even when its argument
is in base 2.
x = 2./3.;
(NumberForm[BaseForm[x, 2],
#1] & ) /@ Range[14, 18]
(output suppressed)
Here we can see the actual binary digits and a mantissa:
RealDigits[2./3.,2]
Length@First@%
{{1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},0}
53
Help says, "NumberForm acts as a ?wrapper?, which affects printing,
but not evaluation." That is, NumberForm[x,n] is equal to the original
x; it merely prints or displays differently, and that's why Precision
doesn't change with the number of displayed digits.
But evaluation actually IS affected:
NumberForm[BaseForm[x,2],16];
%==2
3/2 NumberForm[BaseForm[x, 2], 16]
False
(output suppressed, but not 1.0 as it should be)
Other so-called "wrappers" in Mathematica (such as MatrixForm) also
fail (miserably) to live up to documentation. But oh well; that's
life!!
Bobby
Harold.Noffke at wpafb.af.mil (Harold Noffke) wrote in message news:<c5dhrd$nqp$1 at smc.vnet.net>...
> $Version "5.0 for Microsoft Windows [2000] (November 18, 2003)"
>
> MathGroup:
>
> Some follow-up to Peng Yu's 2004-04-09 post on numerical precision.
>
> On my machine, I get ...
>
> In[1]:= $MachinePrecision
> Out[1]= 15.9546
>
> In[2]:= NumberForm[2./3.]
> Out[2]//NumberForm= 0.666667
>
> In[3]:= NumberForm[2./3., $MachinePrecision]
> NumberForm::iprf:
> Formatting specification 15.9546
> should be a positive integer or a pair of positive integers.
> Out[3]//NumberForm= 0.666667
>
> So, it seems obvious I can't display numbers to $MachinePrecision
> exactly, because $MachinePrecion is not an integer. However ...
>
> In[2]:= NumberForm[2./3., 15]
> Out[2]//NumberForm= 0.666666666666667
>
> In[3]:= NumberForm[2./3., 15] // Precision
> Out[3]= MachinePrecision
>
> In[4]:= NumberForm[2./3., 16]
> Out[4]//NumberForm= 0.6666666666666666
>
> In[5]:= NumberForm[2./3., 16] // Precision
> Out[5]= MachinePrecision
>
> In[6]:= NumberForm[2./3., 20] // Precision
> Out[6]= MachinePrecision
>
> At this point, it looks like 15-digit numbers get rounded, as I
> expect. However, 16- and larger-digit numbers do not get rounded, and
> Mathematica continues to print "MachinePrecision" instead of
> "Arbitrary-Precision". What I expect here is for rounding to
> continue, and for Mathematica to print "Arbitrary-Precision" instead
> of "MachinePrecision" when the number of digits specified become 16 or
> greater.
>
> Clearly I am missing one of Mathematica's syntax subtilties. Can
> someone please clarify this?
>
> Thanks.
> Harold