点状产品的numpy机器精度?

时间:2014-05-14 02:33:13

标签: python numpy

如何处理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.]])

2 个答案:

答案 0 :(得分:2)

尝试numpy.allclose

从链接:

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

我猜你在这里看到的是propagationround-off error。在你的第二个例子中,你很幸运,圆整错误被取消了。