Python中epsilon的值

tho*_*ate 52 python floating-point comparison epsilon

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

在C++中numeric_limits::epsilon( ),提供了一个函数,它为任何给定的数据类型提供epsilon值.Python中有相应的东西吗?

str*_*cat 104

该信息可用sys.float_info,对应于C99中的float.h.

>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16
Run Code Online (Sandbox Code Playgroud)


Erg*_*wun 30

随着strcat发布,有sys.float_info.epsilon.

但是不要忘记将它用作浮点比较的绝对误差范围的缺陷.例如,对于大数字,舍入误差可能超过epsilon.

如果您认为需要复习,标准参考文献是David Goldberg的"每个计算机科学家应该知道的关于浮点算术的内容",或者为了更简单的回顾,您可以查看"浮点指南".


Nav*_*aro 7

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

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

就我而言,我得到了:

The machine epsilon is: 2.220446049250313e-16


She*_*ohn 5

令人惊讶的是这里没有人提到这一点;我想很多人会使用numpy.finfo( type(variable) ).eps来代替。或者.resolution如果是评估精度。

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

  • 不同意“大多数人”:不是每个人都使用 NumPy。如果你想要 *Python* 的 `float` 的 epsilon,使用 `sys.float_info`;仅为此使用 NumPy 会很奇怪。如果你在寻找 *NumPy* 类型(`np.float32`、`np.float64` 等)的值,那么使用 `numpy.finfo`。 (7认同)
  • 是的,但是 `np.finfo(float)` 有点误导,因为 NumPy [立即转换](https://github.com/numpy/numpy/blob/6914bb41f0fb3c1ba500bae4e7d671da9536786f/numpy/core/get78.py)#L `float` 到 `np.float64`,然后报告详细信息。所以它再次报告 NumPy 类型,而不是 Python 的 `float`。(尽管不可否认,`float` 和 `np.float64` 很有可能是相同的格式:它们都在幕后使用 C doubles。) (4认同)

Rúb*_*ias 5

以下内容也对我有用:

>>> import math
>>> math.ulp(1.0)
2.220446049250313e-16
Run Code Online (Sandbox Code Playgroud)