制定 "close enough to zero" 条件

Formulating the "close enough to zero" condition

我正在使用浮点坐标的 3D 矢量进行计算。有时,我想检查一个向量是否非零。但是,对于浮点数,总是有可能出现舍入错误。

Python 中是否有标准方法来检查浮点数是否足够接近于零?我可以写 abs(x) < 0.00001,但它是硬编码的截断,在一般情况下让我感到烦恼......

就像阿米在评论中写的那样,这取决于你在做什么。系统 epsilon 适用于单个操作错误,但是当您在进一步计算中使用已经舍入的值时,错误可能会比系统 epsilon 大得多。举个极端的例子:

import sys
print('%.20f\n' % sys.float_info.epsilon)
x = 0.1
for _ in range(25):
    print('%.20f' % x)
    x = 11*x - 1

使用精确值,x 将始终为 0.1,因为 11*0.1-1 又是 0.1。但真正发生的是这样的:

0.00000000000000022204

0.10000000000000000555
0.10000000000000008882
0.10000000000000097700
0.10000000000001074696
0.10000000000011821655
0.10000000000130038202
0.10000000001430420227
0.10000000015734622494
0.10000000173080847432
0.10000001903889321753
0.10000020942782539279
0.10000230370607932073
0.10002534076687252806
0.10027874843559780871
0.10306623279157589579
0.13372856070733485367
0.47101416778068339042
4.18115584558751685051
44.99271430146268357930
493.91985731608951937233
5432.11843047698494046926
59752.30273524683434516191
657274.33008771517779678106
7230016.63096486683934926987
79530181.94061353802680969238

请注意,原始 x 与 0.1 的差异远小于我的系统 epsilon,但误差很快变得大于那个 epsilon 甚至你的 0.00001,现在它已经达到数百万。

不过,这是一个极端的例子,你遇到这么糟糕的事情的可能性很小。但它表明精度确实取决于你在做什么,所以你必须为你的特定计算找到一个好的方法。