Re: 34.123*89 = 3036.95 (3036.947)

• To: mathgroup at smc.vnet.net
• Subject: [mg47909] Re: 34.123*89 = 3036.95 (3036.947)
• From: "Peltio" <peltio at twilight.zone>
• Date: Fri, 30 Apr 2004 19:26:49 -0400 (EDT)
• References: <c6s538\$pkf\$1@smc.vnet.net>
• Reply-to: "Peltio" <peltioNOSP at Mdespammed.com.invalid>
• Sender: owner-wri-mathgroup at wolfram.com

```"Thomas Schulz" wrote

>I am a NewBe - and i dont understand the Result.
>Mathematica says that 34.123*89 = 3036.94699999997 but its 3036.947...

There is a very interesting 1993 thread that relate to this. Despite many
things have changed in Mathematica since that date, you might find it useful
to read the insight provided by the late Jerry Keiper and by Roberto Sierra.
Here's the reference for a google groups search:

From:David Earn (earn*mail.ast.cam.ac.uk)
To: mathgroup at smc.vnet.net
Object:Arbitrary Precision Floating-Point Arithmetic in mathematica
Newsgroups:sci.math.symbolic
Date:1993-12-08 09:19:27 PST

What I write from now on is only my humble point of view.
Since you are working with machine precision numbers (this roughly means 16
digits), when you write 34.123 you are implicitly telling Mathematica to
pick the number whose internal representation is closest to the exact number
34123/1000. What is such a number? Find it yourself with:

SetPrecision[ 34.123, Infinity ]

It's different from the clean cut fraction 34123/1000, isn't it? That's the
reason you are getting a result that is different from 34123/1000 * 89. Your
result is in fact the decimal expansion (up to 16 digits) of

SetPrecision[ 34.123, Infinity ] * 89

To see 30 digits of it you can do this:

N[ SetPrecision[34.123,Infinity], 30 ]

And, as you might have already surmised by now, the first 16 digits are the
same of the result mathematica gave you by working in machine precision.

>How can i change this?

If you want the exact result you have to work with higher or (possibly)
infinite precision. The simplest way, and also the more expensive one I
guess : ), is to work with infinite precision. Rationalize can avoid you to
write the simple fraction equivalent to your decimal number. This is the
result you are after:

Rationalize[34.123]*89

Watch out, if you use //N you will fall again into the machine precision
swamp and you'll get the number that is closest to that exact number (and
it's not 34.123, sinche that number is not representable in machine
precision). Specifiy a number of digits bigger than your machine precision
(I assumed that it is 16, I do not know the guts of PowerBooks) to _see_

N[Rationalize[34.123]*89, 30]

Hope this helps.
cheers,
Peltio