【问题标题】:Formulating the "close enough to zero" condition制定“足够接近零”条件
【发布时间】:2015-07-28 08:47:02
【问题描述】:

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

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

【问题讨论】:

  • sys.float_info.epsilon
  • @Seva Alekseyev 这真的取决于你在做什么,我不相信有一个通用的解决方案。诸如“C 中的数值食谱”之类的书讨论了每个算法的精度 ad-hoc。我特别是。不同意上面的这些sys.float_info.epsilon cmets。他们讨论的是绝对系统限制,而不是您的特定计算的限制。

标签: python blender


【解决方案1】:

尽管以上所有内容都是正确的,但一些在 Google 上搜索此问题的人可能会发现数学模块中的 isclose 函数值得一试。

【讨论】:

    【解决方案2】:

    就像 Ami 在 cmets 中所写的那样,这取决于您在做什么。系统 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,现在它以百万计。

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

    【讨论】:

    • 这绝不是一个单一的操作。我刚刚看到的示例是两个向量的叉积,其中每个向量来自从用户输入中减去两个点。哦,好吧...
    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2019-08-18
    • 2018-07-13
    相关资源
    最近更新 更多