首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的机器Epsilon

Python中的机器Epsilon
EN

Stack Overflow用户
提问于 2016-01-05 12:35:07
回答 2查看 26.7K关注 0票数 13

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

与机器感应器相差较小的数值是相同的

使用Python,可以通过键入以下命令获得浮点值的机器epsilon

代码语言:javascript
复制
eps = numpy.finfo(float).eps

现在,如果我检查

代码语言:javascript
复制
1 + eps/10 != 1

我得到假的。

但如果我查一下

代码语言:javascript
复制
0.1 + eps/10 != 0.1

我得到了真。

如果我把eps除以100,我的后一个逻辑表达式就变成假的。那么,机器感应器是如何工作的呢?Python文档刚刚说

最小可表示的正数,如1.0 + eps != 1.0。eps的类型是一个合适的浮点类型。

提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-05 12:47:11

浮点数有一定的精度,在科学表示法中有几位小数点。数字越大,代表中最不重要的数字就越大,因此,可能有助于该数字的"epsilon“就越大。

因此,epsilon相对于它所加的数字,这实际上是在您引用的文档中所述:“.使1.0 + eps != 1.0”。如果“参考”数较小,例如一个数量级,那么eps也较小。

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

票数 11
EN

Stack Overflow用户

发布于 2016-01-05 21:00:53

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

本质上,np.spacing计算任何给定数字的“每股收益”。它使用数字的数据类型(原生python浮点数为64位浮点数),因此np.float32np.float16将给出与64位浮点数不同的答案。

例如:

代码语言:javascript
复制
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))

产生的结果:

代码语言:javascript
复制
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
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34611858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档