Python中的机器Epsilon

2024-05-20 11:12:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在学习的一本手册(我是个新手)说:

"Numbers which differ by less than machine epsilon are numerically the same"

使用Python,可以通过键入

eps = numpy.finfo(float).eps

现在,如果我查一下

1 + eps/10 != 1

我得到的是假的。

但如果我查一下

0.1 + eps/10 != 0.1

我得到了真的。

如果把eps除以100,后面的逻辑表达式就变成了False。 那么,机器epsilon是如何工作的呢?Python文档只是说

"The smallest representable positive number such that 1.0 + eps != 1.0. Type of eps is an appropriate floating point type."

提前谢谢你。


Tags: thewhichbyepsmachinearelesssame
2条回答

在这种情况下,您实际上不需要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

浮点数有一定的精度,在科学记数法中可以精确到小数点后几位。数字越大,表示中的最低有效位数字就越大,因此可以贡献该数字的“epsilon”就越大。

因此,epsilon是相对于它被添加到的数字,这实际上是在您引用的文档中声明的:“。。。这样1.0+eps!=1.0英寸。如果“参考”数小于,例如magnit的一个阶数,则eps也较小。

如果不是这样的话,你根本无法用小于eps的数字来计算(在我的例子中是2.2e-16)。

相关问题 更多 >