有谁知道为什么下面不等于0?
import numpy as np
np.sin(np.radians(180))
或者:
np.sin(np.pi)
当我将其输入python时,它的值为1.22e-16。
最佳答案
数字π
不能完全表示为浮点数。因此,np.radians(180)
不会给您π
,它会给您3.1415926535897931
。
实际上,sin(3.1415926535897931)
类似于1.22e-16
。
那么,您如何处理呢?
您必须计算出或至少猜测出适当的绝对和/或相对误差范围,然后编写以下代码而不是x == y
:
abs(y - x) < abs_bounds and abs(y-x) < rel_bounds * y
(这也意味着您必须组织计算,以使相对于
y
的相对误差大于相对于x
的相对误差。在您的情况下,因为y
是常量0
,所以这很简单-只需向后进行即可。)Numpy提供了一个在整个数组
allclose
中为您执行此操作的函数:np.allclose(x, y, rel_bounds, abs_bounds)
(这实际上检查了
abs(y - x) < abs_ bounds + rel_bounds * y)
,但这几乎总是足够的,如果没有,您可以轻松地重新组织代码。)在您的情况下:
np.allclose(0, np.sin(np.radians(180)), rel_bounds, abs_bounds)
那么,您如何知道正确的界限呢? SO答案无法教您足够的错误分析。 Wikipedia上的Propagation of uncertainty提供了高层次的概述。如果您真的不知道,可以使用默认值,它们是
1e-5
相对值和1e-8
绝对值。