O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Floating point

914 visualizações

Publicada em

Publicada em: Tecnologia
  • Login to see the comments

  • Seja a primeira pessoa a gostar disto

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

×