Download - Floating point
Floating point precision problem
Guess the answer
(0.125 + 0.125) * 10;
Guess the answer
(0.125 + 0.125) * 10;
mkotsur@n-racoon:~$ python -iPython 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) [GCC 4.4.5] on linux2Type "help", "copyright", "credits" or "license" for more information.
>>> (0.125 + 0.125) * 10;2.5
Guess the answer
(0.1 + 0.7) * 10;
Guess the answer
(0.1 + 0.7) * 10;
mkotsur@n-racoon:~$ python -iPython 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) [GCC 4.4.5] on linux2Type "help", "copyright", "credits" or "license" for more information.
>>> (0.1 + 0.7) * 10;7.9999999999999991
>>> int((0.1 + 0.7) * 10);7
Guess the answer
(0.1 + 0.1) * 10
Guess the answer
(0.1 + 0.1) * 10;
mkotsur@n-racoon:~$ python -iPython 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) [GCC 4.4.5] on linux2Type "help", "copyright", "credits" or "license" for more information.
>>> (0.1 + 0.1) * 10;2.0
WTF??!11
Python, PHP, Java… => Same problems...
“The IEEE Standard for Floating-Point Arithmetic (IEEE 754-1985)
set the standard for floating-point computation for 23 years. It became the most widely-used standard for floating-point computation, and is followed by many CPU and FPU implementations. Its binary floating-point formats and arithmetic are preserved in the new IEEE 754-2008 standard which replaced it.”
Single float
0.125=0×200×2−1
0×2−21×2−3
0.12510=0.0012
0.0012=1.02×10−11
Single float
M=1.000exp2=−11Mantissa
Sign: 0 for “+”. 1 for “-”. 0 in our case
Exponent bias: + 127 (01111111) – half of a byte.01111100 in our case
Mantissa (fraction): integer part always 1, 23 bits of fraction00000000000000000000000 (23 zeros) in our case
Single float
What about other numbers?
0.125 = 0 01111100 00000000000000000000000
Sign Exponent Mantissa
Single float
0.7 = 0 01111110 01100110011001100110011
0.1 = 0 01111000 10011001100110011001100
0.125 = 0 01111100 00000000000000000000000
Be careful when:
1. You compare results from different sources;2. You do output floats;3. You convert float to another type;4. You use cycles or other ways to accumulate error;
How do people live with this?
1. Don't use float numbers :-)
2. Use 'near' instead of 'equals'
3.Don't trust computers.
More here:
http://en.wikipedia.org/wiki/IEEE_754-2008
http://php.net/manual/en/language.types.float.php
http://docs.python.org/tutorial/floatingpoint.html
http://en.wikipedia.org/wiki/Single_precision_floating-point_format
http://www.lahey.com/float.htm