2011-09-25 28 views
12

Duplicar posible:
How is floating point stored? When does it matter?¿Alguien puede explicar esto: 0.2 + 0.1 = 0.30000000000000004?

¿Por qué ocurre lo siguiente en el intérprete de Python?

>>> 0.1+0.1+0.1-0.3 
5.551115123125783e-17 
>>> 0.1+0.1 
0.2 
>>> 0.2+0.1 
0.30000000000000004 
>>> 0.3-0.3 
0.0 
>>> 0.2+0.1 
0.30000000000000004 
>>> 

¿Por qué no 0.2 + 0.1 = 0.3?

+3

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html – Johnsyweb

+1

http://docs.python.org/tutorial/floatingpoint.html –

Respuesta

9

Esto se debe a que .1 no se puede representar exactamente en una representación de coma flotante binaria. Si intenta

>>> .1 

Python responderá con .1, ya que sólo imprime hasta una cierta precisión, pero ya hay un pequeño error de redondeo. Lo mismo sucede con .3, pero cuando se emite

>>> .2 + .1 
0.30000000000000004 

continuación, los errores de redondeo en .2 y .1 se acumulan. También tenga en cuenta:

>>> .2 + .1 == .3 
False 
+0

Ninguno puede 0.1. –

+0

@MarkByers: buen punto, amplié mi respuesta. –

+2

y 0.2 ;-) ninguno de los 3 se puede representar como (-1)^signo * 1.fracción * 2^(exp-127) ver http://en.wikipedia.org/wiki/IEEE_754-1985 referenciado de respuesta aceptada http://stackoverflow.com/questions/56947/how-is-floating-stored-when-does-it-matter/57031#57031 from the duplicate source http://stackoverflow.com/questions/56947/how-is-floating-point-stored-when-does-it-matter –

7

No todos los números de punto flotante son exactamente representables en una máquina finita. Ni 0.1 ni 0.2 son exactamente representables en punto flotante binario. Y tampoco es 0.3.

Un número es exactamente representable si es de la forma a/b, donde a y b son enteros yb es una potencia de 2. Obviamente, el tipo de datos debe tener un significado lo suficientemente grande para almacenar el número también .

Recomiendo Rob Kennedy's useful webpage como una buena herramienta para explorar la representabilidad.

Cuestiones relacionadas