|
Original |
Translation |
|
11
|
Why are floating point calculations so inaccurate?
|
|
|
12
|
People are often very surprised by results like this::
|
|
|
13
|
>>> 1.2 - 1.0 0.199999999999999996
|
|
|
14
|
and think it is a bug in Python. It's not. This has nothing to do with Python, but with how the underlying C platform handles floating point numbers, and ultimately with the inaccuracies introduced when writing down numbers as a string of a fixed number of digits.
|
|
|
15
|
|
16
|
In decimal math, there are many numbers that can't be represented with a fixed number of decimal digits, e.g. 1/3 = 0.3333333333.......
|
|
|
17
|
In base 2, 1/2 = 0.1, 1/4 = 0.01, 1/8 = 0.001, etc. .2 equals 2/10 equals 1/5, resulting in the binary fractional number 0.001100110011001...
|
|
|
18
|
Floating point numbers only have 32 or 64 bits of precision, so the digits are cut off at some point, and the resulting number is 0.199999999999999996 in decimal, not 0.2.
|
|
|
19
|
A floating point number's ``repr()`` function prints as many digits are necessary to make ``eval(repr(f)) == f`` true for any float f. The ``str()`` function prints fewer digits and this often results in the more sensible number that was probably intended::
|
|
|
20
|
>>> 1.1 - 0.9 0.20000000000000007 >>> print(1.1 - 0.9) 0.2
|
|