制定“足够接近零”条件

Sev*_*yev 5 python blender

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

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

Ste*_*ann 4

就像阿米在评论中写的那样,这取决于你在做什么。系统 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
Run Code Online (Sandbox Code Playgroud)

对于精确值,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
Run Code Online (Sandbox Code Playgroud)

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

不过,这是一个极端的例子,您不太可能遇到如此糟糕的事情。但它表明精度实际上取决于您正在做什么,因此您必须为您的特定计算找到一种好方法。