Inverse confusion about floating point precision
Dan Bishop
danb_83 at yahoo.com
Mon May 9 14:06:22 EDT 2005
Skip Montanaro wrote:
> I understand why the repr() of float("95.895") is
"95.894999999999996".
> What I don't understand is why if I multiply the best approximation
to
> 95.895 that the machine has by 10000 I magically seem to get the lost
> precision back. To wit:
>
> % python
> Python 2.3.4 (#12, Jul 2 2004, 09:48:10)
> [GCC 3.3.2] on sunos5
> Type "help", "copyright", "credits" or "license" for more
information.
> >>> 95.895
> 95.894999999999996
> >>> 95.895 * 10000
> 958950.0
>
> Why isn't the last result "958949.99999999996"? IOW, how'd I get
back the
> lost bits?
You were just lucky.
The floating-point representation of 95.895 is exactly 6748010722917089
* 2**-46.
Multiplying by 10000 gives you 67480107229170890000 * 2**-46. But
floats can have only 53 significant bits, so this gets normalized to
8237317776998399.658203125 * 2**-33 and rounded to 8237317776998400 *
2**-33, which happens to be exactly equal to 958950.
For analogy, consider a decimal calculator with only 3 significant
digits. On this calculator, 1/7=0.143, an error of 1/7000.
Multiplying 0.143 by 7 gives 1.001, which is rounded to 1.00, and so
you get an exact answer for 1/7*7 despite roundoff error in the
intermediate step.
More information about the Python-list
mailing list