Python 制定",;接近于零”;条件

Python 制定",;接近于零”;条件,python,blender,Python,Blender,使用具有浮点坐标的三维向量进行计算。有时,我想检查向量是否为非零。然而,对于浮点数,总是有可能出现舍入错误 请问,在Python中,是否有一种标准的方法来检查浮点数是否足够接近零?我可以写abs(x)

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


请问,在Python中,是否有一种标准的方法来检查浮点数是否足够接近零?我可以写abs(x)<0.00001,但一般来说,硬编码的截止让我感到不舒服…

就像Ami在评论中写的那样,这取决于你在做什么。系统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,现在已经达到数百万


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

尽管上面的一切都是正确的,搜索这个问题的一些人可能会发现数学模块中的
isclose
函数值得检查。

这可能对你有用:
sys.float\u info.epsilon
@Seva Alekseyev这真的取决于你在做什么,我不相信有一个通用的解决方案。像“C中的数字配方”这样的书讨论了精确的特殊per算法。我尤其不同意上面的评论。他们讨论的是绝对系统极限,而不是你特定计算的极限。这从来不是一个单一的操作。我刚才看到的例子是两个向量的叉积,每个向量都来自于从用户输入中减去两点。哦,好吧。。。