Python 中的机器 Epsilon
Machine Epsilon in Python
我正在学习的一本手册(我是新手)说:
"Numbers which differ by less than machine epsilon are numerically the same"
使用 Python,可以通过键入
获得浮点值的机器 epsilon
eps = numpy.finfo(float).eps
现在,如果我检查
1 + eps/10 != 1
我得到错误。
但是如果我检查
0.1 + eps/10 != 0.1
我得到了True。
如果我将 eps 除以 100,我的后一个逻辑表达式将变为 False。
那么,机器 epsilon 是如何工作的呢? Python 文档只是说
"The smallest representable positive number such that 1.0 + eps != 1.0. Type of eps is an appropriate floating point type."
提前致谢。
浮点数有一定的精度,在科学计数法中精确到小数点后几位。数字越大,该表示中的最低有效数字就越大,因此可以对该数字做出贡献的 "epsilon" 就越大。
因此,epsilon 是相对于它所加到的数字而言的,这实际上在您引用的文档中有说明:“...使得 1.0 + eps != 1.0”。如果 "reference" 数字小于,例如一个数量级,那么eps也变小了。
如果不是这种情况,您根本无法计算 小于 eps 的数字(2.2e-16
在我的例子中)。
在这种情况下,您实际上并不想要np.finfo
。你想要的是 np.spacing
,它计算输入和可以精确表示的下一个最大数字之间的距离。
本质上,np.spacing
计算任何给定数字的 "eps"。它使用数字的数据类型(原生 python 浮点数是 64 位浮点数),因此 np.float32
或 np.float16
将给出与 64 位浮点数不同的答案。
例如:
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))
产生:
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
我正在学习的一本手册(我是新手)说:
"Numbers which differ by less than machine epsilon are numerically the same"
使用 Python,可以通过键入
获得浮点值的机器 epsiloneps = numpy.finfo(float).eps
现在,如果我检查
1 + eps/10 != 1
我得到错误。
但是如果我检查
0.1 + eps/10 != 0.1
我得到了True。
如果我将 eps 除以 100,我的后一个逻辑表达式将变为 False。 那么,机器 epsilon 是如何工作的呢? Python 文档只是说
"The smallest representable positive number such that 1.0 + eps != 1.0. Type of eps is an appropriate floating point type."
提前致谢。
浮点数有一定的精度,在科学计数法中精确到小数点后几位。数字越大,该表示中的最低有效数字就越大,因此可以对该数字做出贡献的 "epsilon" 就越大。
因此,epsilon 是相对于它所加到的数字而言的,这实际上在您引用的文档中有说明:“...使得 1.0 + eps != 1.0”。如果 "reference" 数字小于,例如一个数量级,那么eps也变小了。
如果不是这种情况,您根本无法计算 小于 eps 的数字(2.2e-16
在我的例子中)。
在这种情况下,您实际上并不想要np.finfo
。你想要的是 np.spacing
,它计算输入和可以精确表示的下一个最大数字之间的距离。
本质上,np.spacing
计算任何给定数字的 "eps"。它使用数字的数据类型(原生 python 浮点数是 64 位浮点数),因此 np.float32
或 np.float16
将给出与 64 位浮点数不同的答案。
例如:
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))
产生:
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