Re: NumberForm question
- To: mathgroup at smc.vnet.net
- Subject: [mg82026] Re: NumberForm question
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Wed, 10 Oct 2007 04:19:20 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <20828645.1191825480672.JavaMail.root@m35> <fefihj$jm0$1@smc.vnet.net>
DrMajorBob wrote: > I thought I had an answer: the 2 in your InputForm output is in the 17th > decimal position (counting from the leading decimal as 1st position), so > 16-digit precision leaves it out in the NumberForm output. > > $MachineEpsilon > > 2.22045*10^-16 > > BUT: > > NumberForm[x,{100,100}] > > 1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 > > From that, I'd think x is simply 1.0 (contradicting the InputForm). > > But no, since: > > RealDigits[x, 2] > > {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 1}, 1} > > So... you got me, I have no idea why! <snip> If this was not weird enough, we can see that we add three $MachineEpsilon to one, then the latest decimal digit are not displayed or rounded in a consistent way. For instance, compare 1.0000000000000010 returned by NumberForm versus 1.0000000000000007 returned by InputForm. It looks like if the Interpretation box used with NumberForm is messing up the displayed number (see below). In[1]:= x = 1 + 3*$MachineEpsilon; NumberForm[x, {16, 16}] InputForm[x] Out[2]//NumberForm= \!\(\* TagBox[ InterpretationBox["\<\"1.0000000000000010\"\>", 1.0000000000000007`, AutoDelete->True], NumberForm[#, {16, 16}]& ]\) Out[3]//InputForm= 1.0000000000000007 In[4]:= Table[{NumberForm[1 + n*$MachineEpsilon, {16, 16}], N[FromDigits[RealDigits[1 + n*$MachineEpsilon, 2], 2], 20]}, {n, 5}] Out[4]= {{\!\(\* TagBox[ InterpretationBox["\<\"1.0000000000000000\"\>", 1.0000000000000002`, AutoDelete->True], NumberForm[#, {16, 16}]& ]\), 1.0000000000000002220}, {\!\(\* TagBox[ InterpretationBox["\<\"1.0000000000000000\"\>", 1.0000000000000004`, AutoDelete->True], NumberForm[#, {16, 16}]& ]\), 1.0000000000000004441}, {\!\(\* TagBox[ InterpretationBox["\<\"1.0000000000000010\"\>", 1.0000000000000007`, AutoDelete->True], NumberForm[#, {16, 16}]& ]\), 1.0000000000000006661}, {\!\(\* TagBox[ InterpretationBox["\<\"1.0000000000000010\"\>", 1.0000000000000009`, AutoDelete->True], NumberForm[#, {16, 16}]& ]\), 1.0000000000000008882}, {\!\(\* TagBox[ InterpretationBox["\<\"1.0000000000000010\"\>", 1.000000000000001, AutoDelete->True], NumberForm[#, {16, 16}]& ]\), 1.0000000000000011102}} Regards, -- Jean-Marc