Re: Bug 1+4/10
- To: mathgroup at smc.vnet.net
- Subject: [mg120052] Re: Bug 1+4/10
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Thu, 7 Jul 2011 07:30:01 -0400 (EDT)
- References: <iv1acv$sk7$1@smc.vnet.net>
On Jul 6, 4:37 am, "slawek" <sla... at host.pl> wrote:
> Let check
>
> In[1]:= 1.4 == 1 + 4/10
> Out[1]= True
>
> In[2]:= a = SetPrecision[1.4, 30]
> Out[2]= 1.39999999999999991118215802999
>
> In[3]:= b = SetPrecision[1 + 4/10, 30]
> Out[3]= 1.40000000000000000000000000000
>
> No comment is needed.
>
> slawek
(1) Approximate numbers in Mathematica are internally stored and
manipulated in a binary base.
(2) Given an approximate number, SetPrecision will pad with binary
zeros if requested to set to a precision that is greater than the
precision of the input.
The result Out[2] shown above is a consequence of these.
In a bit (well, a few bits...) more detail:
In[24]:= bits = RealDigits[1.4,2]
Out[24]//InputForm=
{{1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1,
1, 0,
0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
0, 0,
1, 1, 0}, 1}
In[25]:= morebits = PadRight[bits[[1]], Floor[20*Log[2,10]]]
Out[25]//InputForm=
{1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1,
1, 0,
0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
In[26]:= rational = FromDigits[{morebits, bits[[2]]}, 2]
Out[26]//InputForm= 3152519739159347/2251799813685248
In[27]:= N[rational,20]
Out[27]//InputForm=
1.399999999999999911182158029987476766109466552734375`20.
Daniel Lichtblau
Wolfram Research