Search All of the Math Forum:
Views expressed in these public forums are not endorsed by
Drexel University or The Math Forum.



Re: Output Precision Exploration
Posted:
Apr 28, 2011 5:43 AM


On Apr 27, 12:39 pm, Rafael Dunn <worthless.trash.j...@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@Log[173.5/173.5]
0
See tutorial/NumericalPrecision in the Mathematica documentation.



