Python dot产品的numpy机器精度?
如何处理numpy中的浮点精度?例如,在下面的Python dot产品的numpy机器精度?,python,numpy,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) arr
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.]])
试试看
从链接:
numpy.allclose(a、b、rtol=1e-05、atol=1e-08)
如果两个数组在公差范围内元素相等,则返回True
公差值为正值,通常为非常小的数字。这个
相对差(rtol*abs(b))和绝对差
加在一起,以对比
a和b
如果任一数组包含一个或多个NAN,则返回False。INF是
如果它们位于同一位置且具有相同的登录,则视为平等
两个阵列
如果以下等式为元素态True,则allclose返回
True
:
absolute(a - b) <= (atol + rtol * absolute(b))
所以:
而不是做:
>>> 0 == -2.22044605e-16
False
做:
试试看
从链接:
numpy.allclose(a、b、rtol=1e-05、atol=1e-08)
如果两个数组在公差范围内元素相等,则返回True
公差值为正值,通常为非常小的数字。这个
相对差(rtol*abs(b))和绝对差
加在一起,以对比
a和b
如果任一数组包含一个或多个NAN,则返回False。INF是
如果它们位于同一位置且具有相同的登录,则视为平等
两个阵列
如果以下等式为元素态True,则allclose返回
True
:
absolute(a - b) <= (atol + rtol * absolute(b))
所以:
而不是做:
>>> 0 == -2.22044605e-16
False
做:
虽然
a
可能等于,但并不等于零!实际上,2.22044605e-16
远大于float64的最小可表示值,即:
np.finfo(float).tiny # = 2.2250738585072014e-308
我猜你在这里看到的是。在第二个示例中,您很幸运,舍入错误被抵消。尽管a可能等于,但它不等于零!实际上,
2.22044605e-16
远大于float64的最小可表示值,即:
np.finfo(float).tiny # = 2.2250738585072014e-308
我猜你在这里看到的是。在第二个示例中,幸运的是,舍入误差被抵消了。处理浮点精度的确切含义是什么?
-2.22044605e-16
在机器精度之前不是零(并且是负数)。。。我不确定你的意思……你误解了分辨率属性。它是10**-precision
,其中precision
是您正在检查的浮点类型可用的精度小数位数的近似值。因此,resolution
是一个(相当糟糕的)最小值的近似值,可以添加到1.0
,而不必返回1.0
。参见.np.finfo(float).eps返回-2.22044605e-16。我该怎么解释呢?[5,5]。点。[-x,x]=-5x+5x=0,不管x是什么,也就是说,x可以是2.22044605e-16或其他任何东西。处理浮点精度的确切含义是什么?-2.22044605e-16
不等于零,而等于机器精度(它是一个负数)。。。我不确定你的意思……你误解了分辨率属性。它是10**-precision
,其中precision
是您正在检查的浮点类型可用的精度小数位数的近似值。因此,resolution
是一个(相当糟糕的)最小值的近似值,可以添加到1.0
,而不必返回1.0
。参见.np.finfo(float).eps返回-2.22044605e-16。我该怎么解释呢?[5,5]。点。[-x,x]=-5x+5x=0,不管x是什么,也就是说,x可以是2.22044605e-16或其他任何东西。0==-2.22044605e-16实际上不是我正在做的,这只是一个例子。重点是,如果我有两个数组,a和b,其中有一堆-2.22044605e-16,我取它们的点积,结果是不同的(见问题中的加法),这是一个很好的精度问题的答案。事实上,由于他的向量值被初始化为O(1e-16),我不认为精度是这里的问题。0==-2.22044605e-16实际上不是我要做的,这只是一个例子。重点是,如果我有两个数组,a和b,其中有一堆-2.22044605e-16,我取它们的点积,结果是不同的(见问题中的加法),这是一个很好的精度问题的答案。事实上,因为他的向量值被初始化为O(1e-16),所以我不认为精度是这里的问题。