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