根据 Wikipedia :
在 Python 中,可以使用 sys.float_info.epsilon
找到 epsilon,并返回一个等价于 2^-52 的值。但是,我可以将大于 2^-53 的任何数字与 1 相加,并且仍然得到与 1 不同的结果。
但是根据上面对 epsilon 的定义,将任何小于 epsilon 的值加到 1 上应该得到 1。
这是否意味着 sys.float_info.epsilon
返回了错误的值,或者 Python 正在使用 epsilon 的其他定义?
下面的代码说明了这一点,浮点数以十六进制格式打印出来。
import sys
import numpy
print 'epsilon=%g' % sys.float_info.epsilon
# output: 2.22045e-16
epsilon = sys.float_info.epsilon
print 'epsilon(hex) = %s' % float.hex(epsilon)
# output: 0x1.0000000000000p-52
one = numpy.float64(1.0)
delta = float.fromhex('0x1.fffffffffffffp-53')
print 'delta = %s' % float.hex(delta)
print 'epsilon - delta = %s' % (float.hex(epsilon-delta))
#output: 0x1.0000000000000p-105
print '\n1.0 + epsilon = %s' % (float.hex(one+numpy.float64(epsilon)))
#output: 0x1.0000000000001p+0
print '\n1.0 + delta = %s' % (float.hex(one+numpy.float64(delta)))
#output: 0x1.0000000000001p+0
# since delta is smaller than epsilon, I expected 0x1.0000000000001p+0
delta1 = float.fromhex('0x1.0000000000001p-53')
print '\n1.0 + %s = %s' % (float.hex(delta1), float.hex(one+delta1))
#output: 0x1.0000000000001p+0
# since delta is smaller than epsilon, I expected 0x1.0000000000001p+0
delta2 = float.fromhex('0x1.0000000000000p-53')
# note: delta2 = epsilon / 2.0
print '\n1.0 + %s = %s' % (float.hex(delta2), float.hex(one+delta2))
# 0x1.0000000000000p+0
结果输出是
epsilon=2.22045e-16
epsilon(hex) = 0x1.0000000000000p-52
delta = 0x1.fffffffffffffp-53
epsilon - delta = 0x1.0000000000000p-105
1.0 + epsilon = 0x1.0000000000001p+0
1.0 + delta = 0x1.0000000000001p+0
1.0 + 0x1.0000000000001p-53 = 0x1.0000000000001p+0
1.0 + 0x1.0000000000000p-53 = 0x1.0000000000000p+0
最佳答案
我认为您所看到的是 Python 的 float
类型在精度不足时如何处理舍入。您引用的描述 epsilon
的维基百科文本似乎忽略了这一部分。
在您的示例中, 1 + delta
被四舍五入为 1 + epsilon
。即使 float
可以指定 delta
和 epsilon
之间的差异,它也不能代表 1 + delta
和 1 + epsilon
之间的差异。正如您所注意到的(使用 delta2
测试),向下舍入为 1
而不是向上舍入到 1 + epsilon
的最大数字似乎是 1 + epsilon/2
。
因此,epsilon
在 Python 中的含义的正确定义可能是:epsilon
是最小的正浮点数,使得 (1 + epsilon) - 1
等于 epsilon
。
关于python - Python 的 epsilon 值是否正确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23190017/