Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Floating point

915 views

Published on

Published in: Technology
  • Login to see the comments

  • Be the first to like this

Floating point

  1. 1. Floating point precision problem
  2. 2. Guess the answer (0.125 + 0.125) * 10;
  3. 3. Guess the answer (0.125 + 0.125) * 10; mkotsur@n-racoon:~$ python -i Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) [GCC 4.4.5] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> (0.125 + 0.125) * 10; 2.5
  4. 4. Guess the answer (0.1 + 0.7) * 10;
  5. 5. Guess the answer (0.1 + 0.7) * 10; mkotsur@n-racoon:~$ python -i Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) [GCC 4.4.5] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> (0.1 + 0.7) * 10; 7.9999999999999991 >>> int((0.1 + 0.7) * 10); 7
  6. 6. Guess the answer (0.1 + 0.1) * 10
  7. 7. Guess the answer (0.1 + 0.1) * 10; mkotsur@n-racoon:~$ python -i Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) [GCC 4.4.5] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> (0.1 + 0.1) * 10; 2.0
  8. 8. 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.”
  9. 9. Single float 0.125=0×20 0×2−1 0×2−2 1×2−3 0.12510=0.0012 0.0012=1.02×10−11
  10. 10. Single float M =1.000exp2=−11 Mantissa 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 fraction 00000000000000000000000 (23 zeros) in our case
  11. 11. Single float What about other numbers? 0.125 = 0 01111100 00000000000000000000000 Sign Exponent Mantissa
  12. 12. Single float 0.7 = 0 01111110 01100110011001100110011 0.1 = 0 01111000 10011001100110011001100 0.125 = 0 01111100 00000000000000000000000
  13. 13. 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;
  14. 14. How do people live with this? 1. Don't use float numbers :-) 2. Use 'near' instead of 'equals' 3.Don't trust computers.
  15. 15. 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-p http://www.lahey.com/float.htm

×