Re: NumberForm question

*To*: mathgroup at smc.vnet.net*Subject*: [mg82047] Re: NumberForm question*From*: DrMajorBob <drmajorbob at bigfoot.com>*Date*: Wed, 10 Oct 2007 04:30:09 -0400 (EDT)*References*: <20828645.1191825480672.JavaMail.root@m35> <fefihj$jm0$1@smc.vnet.net> <13608238.1191965108403.JavaMail.root@m35>*Reply-to*: drmajorbob at bigfoot.com

NumberForm has always been flaky, or its explanation has... and I don't care which. Personally, I never mess with rounding reals or displaying them any special way. Either I want the number in all its detailed glory (InputForm or RealDigits base 2), or I let it display in the default mode. Bobby On Tue, 09 Oct 2007 09:59:06 -0500, Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com> wrote: > 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, -- DrMajorBob at bigfoot.com