高效的浮点比较

rav*_*avi 0 c c++ floating-point performance

嗨,我有一个函数定义为

int compareAB(float A, float B)  
{  
    if(A > B) 
    {  
        return 1;  
    }
    else if(A < B)
    {
        return -1;  
    }  
    else
    {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

从性能工具中可以看出,上述功能在我的项目中进行比较花费了太多时间。我可以改善它的运行时间吗?

我认为的一种方法是取 2 个数字的差,然后将其与零进行比较。

谢谢,

编辑:此函数用于排序比较函数以维护搜索树数据结构。现在也更正了返回值。

Bat*_*eba 5

这看起来像是试图规避“不应该比较浮点数相等”规则的人为方式。比较不等式与比较等式没有太大区别,因为您在两种情况下都隐含地依赖于浮点精度。您最后的“else”语句是隐含的 A == B。

正常的习惯用法是if (::fabs(A - B) < e)e 是一些容忍度,尽管在您的情况下您不需要::fabs.

如果您想要正、负和相等的不同结果(在计算精度的范围内),请执行以下操作

if (A - B > e){
    return 0;
} else if (A - B < -e){
    return 1;
} else {
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

最好的情况是将 e 设置为std::numeric_limits<double>::epsilon()。实际值取决于为到达 A 和 B 所执行的计算步骤数。1e-08 可能是现实的。

至于速度,不幸的是:我看不出这是瓶颈或运行得更快。

  • 这个答案是垃圾,因为: (a) 反对比较浮点数相等的建议不是一条规则,只是经常重复的坏建议。(b) 这段代码看起来不像是一种人为地规避建议的方式。(c) fabs(AB) 与容差的比较可能很常见,但并不正常。(d) 没有使用 epsilon 作为容差的基础。大于 2 的数字永远不会有这样的差异,而小得多的数字可能会有更小的差异。 (6认同)
  • @Bathsheba:不,我不会提供不恰当的答案。正如我在对该问题的评论中所写的那样,没有足够的信息来提供有用的建议,只能说在加速该功能方面几乎无能为力。此时进行的正确方法是让提问者提供更多信息。 (4认同)
  • (g) 使用容差进行比较将某些结果更改为其他结果(例如,将返回 0 的情况变为返回 -1 的情况)。但是,如果不了解应用程序,就无法说明这是改进还是不利。此更改可能会将有用的结果转换为不正确和有害的结果。 (3认同)
  • 这个解决方案的*大*问题是它破坏了排序。如果`a == b` 和`b == c`,任何理智的排序算法都会得出结论`a == c`。然而,当使用建议的函数时,当 `a` 和 `b` 以及 `b` 和 `c` 分别小于 epsilon 时,情况并非如此,而 `a` 和 `c` 则不然。 (3认同)
  • @ydroneuad:而且,既然信息已添加到问题中,我们看到这实际上是 `==` 完全没问题的情况之一。排序数字应该通过简单的比较(无容差)来完成。使用容差可能会破坏排序例程。 (3认同)