Python中epsilon的值


68

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

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


6
比较浮标时,值的大小会影响ε。
约翰·拉鲁伊

1
还请考虑值的错误会在操作之间传播。“数值分析”字段专门用于对此进行研究。 站点还提供了一些很好的规则。
Casey Kuball 2012年

例如,上面的人们的评论是1e300-(1e300-1e200)return 0.0,其中实际差异必须为10 ^ 200。
THN

Answers:


126

该信息在中提供,该信息sys.float_info与C99中的float.h相对应。

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


6

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

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

就我而言,我得到了:

The machine epsilon is: 2.220446049250313e-16


生成eps的好方法,但为什么将其称为机器精度呢?
gfdsal

@gfdsal:谢谢,我认为机器epsilon应该是准确的术语。
s.ouchene

5

惊讶的是这里没有人提到这件事;我认为许多人会改用numpy.finfo(type(variable)).eps。还是.resolution要评估精度。

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


6
对“大多数人”持不同意见:并非每个人都使用NumPy。如果你想为小量的Pythonfloat,使用sys.float_info; 仅仅为此使用NumPy会很奇怪。如果你的价值观后NumPy的类型(np.float32np.float64,等),然后使用numpy.finfo
Mark Dickinson

1
更改了措辞。为了澄清起见,np.finfo(float) 它确实可以工作,但是我同意,如果您从不使用numpy,那么仅为此安装软件包就太过头了。
乔纳森·H

3
右,但np.finfo(float)有点误导,因为NumPy的立即转换floatnp.float64,然后报告细节这一点。因此,它再次报告了NumPy类型,而不是Python的float。(但无可否认,这是压倒性的可能是floatnp.float64是相同的格式:他们用C双打引擎盖下两个。)
马克·迪金森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.