Точность с плавающей точкой в ​​массиве Python - PullRequest
5 голосов
/ 02 марта 2011

Прошу прощения за действительно простой и тупой вопрос; однако, почему разница в точности отображается для этих двух случаев?

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

Я использую python2.6.6 на 64-битной Linux. Заранее благодарю за помощь.

Это также верно для списка в python

>>> t = [0.22]
>>> t
[0.22]

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

1 Ответ

6 голосов
/ 02 марта 2011

Потому что это разные числа и разные числа имеют разные эффекты округления.

(Практически любой из связанных вопросов справа внизу объяснит причину самих эффектов округления.)


Хорошо, более серьезный ответ.Похоже, что numpy выполняет некоторое преобразование или вычисление чисел в массиве:

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


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

, тогда как Python не делает этого автоматически:

>>> t = 0.22
>>> t
0.22

>>> t = 0.24
>>> t
0.24

Ошибка округления меньше, чем у numpyЗначение «eps» для float, которое подразумевает, что оно должно рассматриваться как равное (и фактически оно есть):

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

>>> numpy.array([0.24])[0] == 0.24
True

Но причина, по которой Python отображает его как «0,24», а numpy неДело в том, что метод Python по умолчанию float.__repr__ использует более низкую точность (что, IIRC, было довольно недавним изменением):

>>> str(numpy.array([0.24])[0])
0.24

>>> '%0.17f' % 0.24
'0.23999999999999999'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...