当前位置:  开发笔记 > 编程语言 > 正文

Python中的机器Epsilon

如何解决《Python中的机器Epsilon》经验,为你挑选了2个好方法。

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

"差异小于机器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类型是一种合适的浮点类型."

先感谢您.



1> Joe Kington..:

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

基本上,np.spacing计算任何给定数字的"eps".它使用数字的数据类型(本机python浮点数是64位浮点数),因此a 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



2> tobias_k..:

浮点数具有一定的精度,以科学计数法的几个小数位.数字越大,该表示中的最低有效数字越大,因此可能对该数字有贡献的"epsilon"越大.

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

如果不是的话,你可以不计算在所有与数字比EPS小(2.2e-16在我的情况).

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有