在Python中有标准的epsilon值(或获取方法)吗?我需要比较浮点数值,并希望与最小可能差异进行比较。
在C++中,提供了一个函数numeric_limits::epsilon()
,可以给出任何给定数据类型的epsilon值。Python中是否有等价的函数?
在Python中有标准的epsilon值(或获取方法)吗?我需要比较浮点数值,并希望与最小可能差异进行比较。
在C++中,提供了一个函数numeric_limits::epsilon()
,可以给出任何给定数据类型的epsilon值。Python中是否有等价的函数?
该信息可以在sys.float_info
中找到,它对应于C99中的float.h。
>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16
正如strcat发布的,有sys.float_info.epsilon
。
但不要忘记将其用作浮点比较的绝对误差边界时可能会遇到陷阱。例如,对于大数,舍入误差可能超过epsilon。
如果您认为需要温习知识,则标准参考是David Goldberg的《计算机科学家应该了解的浮点运算》,或者可以查看浮点指南进行简单的复习。
如果您找不到一个可以做到这一点的函数,请记住计算机机器epsilon的算法非常简单(您可以使用您喜欢的编程语言进行测试)。例如,对于python:
eps = 1.0
while eps + 1 > 1:
eps /= 2
eps *= 2
print("The machine epsilon is:", eps)
在我的情况下,我得到了:
机器精度为:2.220446049250313e-16
惊讶地发现这里没有人提到; 我认为许多人会使用numpy.finfo(type(variable)).eps。 或者.resolution
如果它是用于评估精度。
请注意,finfo
仅适用于浮点类型,并且它也适用于Python自己的float
类型(即不限于numpy的类型)。 整数类型的等效物是iinfo
,尽管它不包含精度信息(因为,嗯,为什么要包含呢?)。
sys.float_info
;单独为此目的使用NumPy可能有些奇怪。如果您需要* NumPy *类型(np.float32
、np.float64
等)的值,则请使用numpy.finfo
。 - Mark Dickinsonnp.finfo(float)
确实有效,但如果您从未使用过numpy,则仅为此安装该软件包可能有些过度。 - Jonathan Hnp.finfo(float)
有些误导性,因为 NumPy 会 立即将 float
转换为 np.float64
,并报告该类型的详细信息。所以它再次报告的是 NumPy 类型,而不是 Python 的 float
。(尽管可以肯定的是,float
和 np.float64
很可能是相同的格式:它们都在底层使用 C double。) - Mark Dickinson>>> import math
>>> math.ulp(1.0)
2.220446049250313e-16
1e300-(1e300-1e200)
返回0.0
,而实际差异应该是10^200。 - THN