Python中的机器Epsilon

时间:2016-01-05 12:35:07

标签: python numpy floating-point precision

我正在学习的手册(我是新手)说:

  

“相差小于机器epsilon的数字在数值上相同”

使用Python,可以通过键入

来获取浮动值的机器epsilon
eps = numpy.finfo(float).eps

现在,如果我检查

1 + eps/10 != 1

我获得了假。

但如果我检查

0.1 + eps/10 != 0.1

我获得了真实。

如果我将eps除以100,则后一个逻辑表达式变为False。 那么,机器epsilon如何工作? Python文档只是说

  

“最小可表示的正数,使得1.0 + eps!= 1.0。eps类型是一种合适的浮点类型。”

提前谢谢。

2 个答案:

答案 0 :(得分:9)

浮点数具有一定的精度,科学计数法为几位小数。数字越大,该表示中的最低有效数字越大,因此ε"越大。这可能会导致这个数字。

因此,epsilon相对于它所添加的数字,实际上在你引用的文档中有说明:" ...这样1.0 + eps!= 1.0"。如果"参考"例如,数字越小一个magnit,然后eps也更小。

如果不是这种情况,则无法计算 at all ,数字小于eps(在我的情况下为2.2e-16)。

答案 1 :(得分:9)

在这种情况下,您实际上不需要np.finfo。您想要的是np.spacing,它计算输入与可以准确表示的下一个最大数字之间的距离。

基本上,np.spacing计算任何给定数字的“eps”。它使用数字的数据类型(本机python浮点数是64位浮点数),因此np.float32np.float16将给出与64位浮点数不同的答案。

例如:

import numpy as np

print 'Float64, 1.0 -->', np.spacing(1.0)
print 'Float64, 1e12 -->', np.spacing(1e12)
print 'Float64, 1e-12 -->', np.spacing(1e-12)
print ''
print 'Float32, 1.0 -->', np.spacing(np.float32(1.0))
print 'Float32, 1e12 -->', np.spacing(np.float32(1e12))
print 'Float32, 1e-12 -->', np.spacing(np.float32(1e-12))

哪个收益率:

Float64, 1.0 --> 2.22044604925e-16
Float64, 1e12 --> 0.0001220703125
Float64, 1e-12 --> 2.01948391737e-28

Float32, 1.0 --> 1.19209e-07
Float32, 1e12 --> 65536.0
Float32, 1e-12 --> 1.0842e-19