MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Serious Bug in Mathematica 7 and 8.0.4.0 (latest version)

  • To: mathgroup at smc.vnet.net
  • Subject: [mg126204] Re: Serious Bug in Mathematica 7 and 8.0.4.0 (latest version)
  • From: DrMajorBob <btreat1 at austin.rr.com>
  • Date: Wed, 25 Apr 2012 00:32:47 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com

None of this is unexpected.

The original number, represented as a rational, is:

x = 637101/100

637101/100

(unchanged by automatic factor cancellations)

100 is not a power of two, so the fraction CANNOT be exactly represented  
in binary floating point.

The stored representation and its rational equivalent are:

{bits, digitsToLeft} = RealDigits[N@x, 2]
digitsToRight = Length@bits - digitsToLeft
rational = FromDigits[bits, 2]/2^digitsToRight

{{1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
    0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
   1, 1, 1, 1, 0, 1, 1, 0}, 13}

40

3502499787838587/549755813888

The stored number is not equal to the original, of course:

x == rational

False

But it's "close":

N[rational]

6371.01

N[rational, 50]

6371.0100000000002182787284255027770996093750000000

If you're wondering how FromDigits works, consider:

FromDigits[bits, z] // Expand
% /. z -> 2

z + z^2 + z^4 + z^5 + z^6 + z^7 + z^11 + z^13 + z^18 + z^19 + z^20 + \
z^22 + z^24 + z^25 + z^26 + z^27 + z^31 + z^33 + z^40 + z^41 + z^45 + \
z^46 + z^47 + z^51 + z^52

7004999575677174

%/2^40

3502499787838587/549755813888

Bobby

On Tue, 24 Apr 2012 04:33:56 -0500, Ralph Dratman  
<ralph.dratman at gmail.com> wrote:

> One could argue that because those digits were not specified, they
> could be anything.
>
> Just kidding! Still, they could be anything.
>
>
>
> On Mon, Apr 23, 2012 at 5:41 AM, Alexander Mayer <amayer at alum.mit.edu>  
> wrote:
>> In[1]:= (* This notebook produced by Mathematica 8.0.4.0 *)
>> (* Platform: OSX 10.6.8 on MacBook Pro *)
>>
>> In[1]:= b = 6371.01 (* We set the value of b to this real number. *)
>>
>> Out[1]= 6371.01
>>
>> In[2]:= SetPrecision[a = b, 20] (* We test the actual value of b. *)
>>
>> Out[2]= 6371.0100000000002183
>>
>> In[3]:= (* Mathematica has added a small constant! *)
>


-- 
DrMajorBob at yahoo.com



  • Prev by Date: FindFit and squared residuals
  • Next by Date: Re: evaluating functions and displaying results numerically
  • Previous by thread: Re: Serious Bug in Mathematica 7 and 8.0.4.0 (latest version)
  • Next by thread: Re: Serious Bug in Mathematica 7 and 8.0.4.0 (latest version)