2016-02-12 7 views
0

Почему np.arange(5, 60, 0.1)[150] выход 19.999999999999947. Но np.arange(5, 60, 0.5)[30] выход 20.0?numpy.arange ошибки с плавающей запятой

Почему это происходит?

+0

Это может помочь: http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate. В вашем случае 0.5 имеет точное двоичное представление в виде числа с плавающей запятой, а 0,1 - нет. – xnx

ответ

1

Это потому, что поплавки (в большинстве случаев) не могут представлять точное значение, которое вы положили. Попробуйте print("%.25f" % np.float64(0.1)), который возвращает 0.1000000000000000055511151, что не совсем точно 0.1.

Numpy уже обеспечивает хорошее обходное решение для почти равных (с плавающей запятой) сравнений: np.testing.assert_almost_equal, поэтому вы можете протестировать с помощью np.testing.assert_almost_equal(20,np.arange(5, 60, 0.1)[150]).

Причина, по которой ваш второй пример дает реальное значение, заключается в том, что 0.5 может быть представлен как точный поплавок 2**(-1) = 0.5, и поэтому умножения с этим значением не страдают от этой проблемы с плавающей запятой.

Смежные вопросы