una ?

Batista, Facundo Facundo.Batista en telefonicamoviles.com.ar
Jue Abr 14 23:16:53 CEST 2005


[Juan Carlos Cuello]

#- Nunca programe y empece con python.por que da la multiplicacion asi
#- 4*5.2=20.8000000000000001.


http://www.python.org/doc/faq/es/general.html#por-qu-los-c-lculos-de-punto-f
lotante-son-tan-inexactos


La gente normalmente se sorprende por resultados como este:

>>> 1.2-1.0
0.199999999999999996

y piensa que es una falla en Python. No lo es. Es un problema causado por la
representación interna de los números de punto flotante, los cuales usan un
número fijo de dígitos binarios para representar un número decimal. Algunos
números decimales no pueden representarse exactamente en binario, lo que
resulta en pequeños errores de redondeo.

En matemática decimal, hay muchos números que no pueden representarse con un
número fijo de dígitos decimales, ej. 1/3 = 0.3333333333.......

En base 2, 1/2 = 0.1, 1/4 = 0.01, 1/8 = 0.001, etc. .2 es igual a 2/10 que
es igual a 1/5, resultando en el número binario fraccional
0.001100110011001...

Los números de punto flotante tienen solamente 32 o 64 bits de precision,
por lo que se cortan los dígitos en algún punto, y el número resultante es
0.199999999999999996 en decimal, no 0.2.

La función repr() de un punto flotante muestra tantos dígitos como sea
necesario para hacer verdad a eval(repr(f)) == f para cualquier flotante f.
La función str() muestra menos dígitos, y esto frecuentemente resulta en un
número más sensible que el que probablemente se pretendía:

>>> 0.2
0.20000000000000001
>>> print 0.2
0.2

Nuevamente, esto no tiene nada que ver con Python, sino con la manera en que
la plataforma subyacente de C maneja los números de punto flotante, y de
última con la imprecisión que siempre tendrá al escribir números como una
cadena de una cantidad fija de dígitos.

Una de las consecuencias de esto es que es peligroso comparar el resultado
de algunos cálculos a un flotante con ==. Pequeñas imprecisiones pueden
significar que == falle. En cambio, usted debe controlar que la diferencia
entre los dos números sea menor que un cierto límite:

epsilon = 0.0000000000001 # pequeño error permitido
resultado_esperado = 0.4

if resultado_esperado-epsilon <= calculo() <= resultado_esperado+epsilon:
   ...

Por favor consulte el capítulo sobre aritmética de punto flotante en el
tutorial de Python para más información.


.    Facundo

Bitácora De Vuelo: http://www.taniquetil.com.ar/plog
PyAr - Python Argentina: http://www.python.org/ar/




Más información sobre la lista de distribución Python-es