Python中epsilon的取值

91

在Python中有标准的epsilon值(或获取方法)吗?我需要比较浮点数值,并希望与最小可能差异进行比较。

在C++中,提供了一个函数numeric_limits::epsilon(),可以给出任何给定数据类型的epsilon值。Python中是否有等价的函数?


8
比较浮点数时,值的大小会影响epsilon。 - John La Rooy
1
还要考虑到数值误差可能会在操作中传播。"数值分析"领域致力于研究这一问题。此网站(http://floating-point-gui.de/errors/propagation/)也提供了一些很好的规则供参考。 - Casey Kuball
作为对上面评论的一个例子,1e300-(1e300-1e200) 返回 0.0,而实际差异应该是10^200。 - THN
5个回答

157

该信息可以在sys.float_info中找到,它对应于C99中的float.h。

>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16

38

18

如果您找不到一个可以做到这一点的函数,请记住计算机机器epsilon的算法非常简单(您可以使用您喜欢的编程语言进行测试)。例如,对于python:

eps = 1.0
while eps + 1 > 1:
    eps /= 2
eps *= 2
print("The machine epsilon is:", eps)

在我的情况下,我得到了:

机器精度为:2.220446049250313e-16


生成EPS的好方法,但为什么要称其为机器精度? - gfdsal
@gfdsal:谢谢,我认为机器精度应该是确切的术语。 - s.ouchene

10

惊讶地发现这里没有人提到; 我认为许多人会使用numpy.finfo(type(variable)).eps。 或者.resolution如果它是用于评估精度。

请注意,finfo仅适用于浮点类型,并且它也适用于Python自己的float类型(即不限于numpy的类型)。 整数类型的等效物是iinfo,尽管它不包含精度信息(因为,嗯,为什么要包含呢?)。


8
关于“大多数人”的观点存在争议:并非每个人都使用NumPy。如果您想要Python中的浮点数epsilon,请使用sys.float_info;单独为此目的使用NumPy可能有些奇怪。如果您需要* NumPy *类型(np.float32np.float64等)的值,则请使用numpy.finfo - Mark Dickinson
1
更改措辞。为了澄清,np.finfo(float)确实有效,但如果您从未使用过numpy,则仅为此安装该软件包可能有些过度。 - Jonathan H
4
没错,但是 np.finfo(float) 有些误导性,因为 NumPy 会 立即将 float 转换为 np.float64,并报告该类型的详细信息。所以它再次报告的是 NumPy 类型,而不是 Python 的 float。(尽管可以肯定的是,floatnp.float64 很可能是相同的格式:它们都在底层使用 C double。) - Mark Dickinson

5
以下内容对我也起作用了:
>>> import math
>>> math.ulp(1.0)
2.220446049250313e-16

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接