Почему np.arange(5, 60, 0.1)[150]
выход 19.999999999999947
. Но np.arange(5, 60, 0.5)[30]
выход 20.0
?numpy.arange ошибки с плавающей запятой
Почему это происходит?
Почему np.arange(5, 60, 0.1)[150]
выход 19.999999999999947
. Но np.arange(5, 60, 0.5)[30]
выход 20.0
?numpy.arange ошибки с плавающей запятой
Почему это происходит?
Это потому, что поплавки (в большинстве случаев) не могут представлять точное значение, которое вы положили. Попробуйте 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
, и поэтому умножения с этим значением не страдают от этой проблемы с плавающей запятой.
Это может помочь: http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate. В вашем случае 0.5 имеет точное двоичное представление в виде числа с плавающей запятой, а 0,1 - нет. – xnx