如何处理numpy中的浮点数精度?例如,在下面的a==0
中返回False,即使达到机器精度,它也是0:
a = -2.22044605e-16
这尤其是一个问题,因为我正在使用向量的点积,看起来结果受到影响,即a被视为“负数”。
np.finfo(float).eps
返回-2.22044605e-16
以下是一个例子:
a = np.array([[-2.22044605e-16,-2.22044605e-16]])
b = np.array([[5,5]])
np.dot(a,b)
array([[ -2.22044605e-15]])
a = np.array([[-2.22044605e-16,2.22044605e-16]])
np.dot(a,b.T)
array([[ 0.]])
答案 0 :(得分:2)
从链接:
numpy.allclose(a, b, rtol=1e-05, atol=1e-08)
如果两个数组在容差范围内在元素方面相等,则返回True。
公差值为正,通常为非常小的数字。该 相对差异(rtol * abs(b))和绝对差异atol 加在一起比较两者之间的绝对差异 a和b。
如果任一数组包含一个或多个NaN,则返回False。 Infs是 如果它们在同一个地方并且具有相同的标志,则视为相等 两个阵列。
如果以下等式是按元素为真的,则allclose返回
True
:absolute(a - b) <= (atol + rtol * absolute(b))
示例强>:
>>> np.allclose([1e10,1e-7], [1.00001e10,1e-8])
False
>>> np.allclose([1e10,1e-8], [1.00001e10,1e-9])
True
>>> np.allclose([1e10,1e-8], [1.0001e10,1e-9])
False
>>> np.allclose([1.0, np.nan], [1.0, np.nan])
False
<强>所以:强>
而不是:
>>> 0 == -2.22044605e-16
False
做的:
>>> import numpy as np
>>> np.allclose([0], [-2.22044605e-16])
True
答案 1 :(得分:2)
虽然a
可能等于machine epsilon但不会使其为零!实际上2.22044605e-16
远大于float64的最小可表示值,即:
np.finfo(float).tiny # = 2.2250738585072014e-308
我猜你在这里看到的是propagation的round-off error。在你的第二个例子中,你很幸运,圆整错误被取消了。