Re: Output Precision Exploration
- To: mathgroup at smc.vnet.net
- Subject: [mg118428] Re: Output Precision Exploration
- From: Barak Shoshany <baraksh at gmail.com>
- Date: Thu, 28 Apr 2011 06:33:07 -0400 (EDT)
- References: <ip8o8c$piq$1@smc.vnet.net>
On Apr 27, 12:39 pm, Rafael Dunn <worthless.trash.j... at gmail.com> wrote: > Mathematica 8.0.1.0, Mac OSX x86 > > In:= > Log[173.5/173.5] > > Out:= > -1.11022*10^-16 > > I expect an output of exactly 0. Although 10^-16 is small, it turned > out to be the largest factor in a chemical equation I was attempting to > compute. > > I discovered this is because Mathematica does not actually evaluate > 173.5/173.5 = 1. The output is actually some number 0.9999999999... > > However, for most decimal constants x/x produces an exact output of 1. > By entering a few decimals off the top of my head I also found 1733.5, > 26.44, and 27.44 do not produce an output of 1 when divided by > themselves. > > Why? I understand Mathematica's algorithms for working with decimals > must make approximations, but why is there so much variance among > decimal calculations? 173.49/173.49 = 1, while 173.5/173.5 != 1. > Furthermore, I find: > x=173.49999999999999 > x/x = 173.5/173.5, with infinite precision. If you add or remove a > single 9 to the end of x, this ceases to be true. > > Furthermore, this looks like a contradiction to me: > > In:= > 173.5/173.5 = 1 > Log[1] = 0 > Log[173.5/173.5] = 0 > > Out:= > True > True > False > > I have learned a lot about Mathematica's precision and approximation through the help documentation, but I still can not explain this or see how I can expect Log[x/x] = 0 for the sake of calculations on the 10^-16 scale. 173.5 is a machine precision number, not an exact number. So it's only know up to a certain precision. Try this: InputForm[173.5/173.5] 0.9999999999999999 So it's only *approximately* 1. Of course, you could specify the numbers to be of arbitrary precision, for example 100 digits: Log[173.5`100/173.5`100] 0.*10^-100 However, the answer will never be *exactly* 0 because it is only known to a certain precision. This is what Chop was made for: Chop at Log[173.5/173.5] 0 See tutorial/NumericalPrecision in the Mathematica documentation.