Precisión de punto flotante en la matriz de Python

Pido disculpas por la pregunta realmente simple y tonta; sin embargo, ¿por qué hay una diferencia en la precisión mostrada para estos dos casos?

1)

>> test = numpy.array([0.22]) >> test2 = test[0] * 2 >> test2 0.44 

2)

 >> test = numpy.array([0.24]) >> test2 = test[0] * 2 >> test2 0.47999999999999998 

Estoy usando python2.6.6 en Linux de 64 bits. Gracias de antemano por su ayuda.

Esto también se mantiene para una lista en python.

 >>> t = [0.22] >>> t [0.22] >>> t = [0.24] >>> t [0.23999999999999999] 

Porque son números diferentes y números diferentes tienen diferentes efectos de redondeo.

(Prácticamente cualquiera de las preguntas relacionadas en el lado derecho explicará la causa de los efectos de redondeo en sí mismos).


De acuerdo, una respuesta más seria. Parece que Numpy realiza alguna transformación o cálculo en los números de una matriz:

 >>> t = numpy.array([0.22]) >>> t[0] 0.22 >>> t = numpy.array([0.24]) >>> t[0] 0.23999999999999999 

mientras que Python no hace esto automáticamente:

 >>> t = 0.22 >>> t 0.22 >>> t = 0.24 >>> t 0.24 

El error de redondeo es menor que el valor “eps” de numpy para float , lo que implica que debe tratarse como igual (y, de hecho, lo es):

 >>> abs(numpy.array([0.24])[0] - 0.24) < numpy.finfo(float).eps True >>> numpy.array([0.24])[0] == 0.24 True 

Pero la razón por la que Python lo muestra como ‘0.24’ y no lo hace numpy es porque el método por defecto float.__repr__ usa una precisión más baja (que, IIRC, fue un cambio bastante reciente):

 >>> str(numpy.array([0.24])[0]) 0.24 >>> '%0.17f' % 0.24 '0.23999999999999999'