python - Python 的 epsilon 值是否正确?

标签 python numpy numeric numerical-methods

根据 Wikipedia :

Machine epsilon is defined as the smallest number that, when added to one, yields a result different from one

在 Python 中,可以使用 sys.float_info.epsilon 找到 epsilon,并返回一个等于 2^-52 的值。但是,我可以将任何大于 2^-53 的数字加到 1,但仍然会得到与 1 不同的结果。 但是根据 epsilon 的上述定义,将任何小于 epsilon 的值加到 1 上应该得到 1。 这是否意味着 sys.float_info.epsilon 返回的值不正确,或者 Python 使用了 epsilon 的其他定义?

下面的代码说明了这一点, float 以十六进制格式打印出来。

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 可以指定 deltaepsilon 之间的差异,但它不能表示 1 + delta 之间的差异和 1 + epsilon。正如您所注意到的(通过 delta2 测试),向下舍入到 1 而不是向上舍入到 1 + epsilon 的最大数字似乎是为 1 + epsilon/2

因此,epsilon 在 Python 中的正确定义可能是:

epsilon 是满足 (1 + epsilon) - 1 等于 epsilon 的最小正 float 。

关于python - Python 的 epsilon 值是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23190017/

相关文章:

python - numpy 数组整数索引多于一维

Julia on Float 与 Octave on Float

php - Python 脚本从内部被杀死,但进程并没有死

python - 如何替换numpy数组每行中的N个最小元素?

Python 机会游戏

python - 如何以正确的格式在文本文件中写入两个 numpy 数组?

r - R中二进制运算的非数字参数错误,需要说明

c - 为了实时数值积分的目的,如何测量 c 中的时间?

python - 并行解压缩数百万个文件

python - 在 Python 中使用嵌套列表推导式修改矩阵