2014-05-14 57 views
1

我该如何处理numpy中的浮动精度?例如在下面的a==0返回FALSE,即使高达机器精度是0:点状产品的凹凸机精度?

a = -2.22044605e-16 

这是因为我正在向量的点积和,好像结果受到影响,即一个特别的问题视为“负面”数字。

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

你究竟是什么意思,处理浮点精度? –

+2

'-2.22044605e-16'到机器精度不为零(而且它是一个负数)......我不确定你的意思是什么...... – mgilson

+1

你误解了“resolution”属性。它是'10 ** - precision',其中'precision'是您正在检查的浮点类型可用的精度的近似小数位数。因此,'resolution'是一个(相当糟糕的)近似值,你可以添加到'1.0'的最小数量,而不用返回'1.0'。参见['finfo'文档](http://docs.scipy.org/doc/numpy/reference/generated/numpy.finfo.html)。 – user2357112

回答

2

尝试numpy.allclose

从链接:

numpy.allclose(a, b, rtol=1e-05, atol=1e-08)

返回true如果两个数组元素方面的一个公差范围内相等。

公差值为正,通常非常小。将 相对差值(rtol * abs(b))和绝对差值atol 加在一起以与 a和b之间的绝对差值进行比较。

如果任一数组包含一个或多个NaN,则返回False。 Infs是 ,如果它们在同一个地方并且在 两个数组中都被视为相等。


如果下面的等式是逐元素True,则返回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 
+0

0 == -2.22044605e-16实际上并不是我正在做的,这只是一个例子。问题是,如果我有两个数组,a和b,其中有一堆-2.22044605e-16,我拿他们的点积,结果是不同的(见问题中的增加) – methane

+0

这是一个很好的回答一个精确问题。实际上,由于他的矢量值被初始化为O(1e-16),所以我认为精度不是问题。 – Paul

2

虽然a可能等于machine epsilon不使它成为一个零!事实上2.22044605e-16比为float64最小的代表,能值,这是更大的:

np.finfo(float).tiny # = 2.2250738585072014e-308 

我猜你现在看到的是一个round-off errorpropagation。在你的第二个例子中,你很幸运,舍入错误被取消了。