首页 > 解决方案 > 有效检查两个浮点值是否具有不同的符号

问题描述

我需要找出两个有限浮点值是否具有不同AB符号或其中一个是否为零。

在许多代码示例中,我看到测试如下:

if ( (A <= 0 && B >= 0) || (A >= 0 && B <= 0) )

它工作正常,但对我来说似乎效率低下,因为这里验证了许多条件,并且每个条件分支对于现代 CPU 来说都是一个缓慢的操作。

另一种选择是使用浮点值的乘法:

if ( A * B <= 0 )

即使在溢出的情况下它也应该工作,因为无穷大值保留了正确的符号。

执行检查的最有效方法是什么(这两个之一或可能其他一些)?

标签: c++performancefloating-pointconditional-statements

解决方案


有效检查两个浮点值是否具有不同的符号

if ( A * B <= 0 )无法区分标志何时AB属于集合-0.0, +0.0

考虑signbit()

if (signbit(A) == signbit(B)) {
  ; // same sign
} else  {
  ; // distinct signs
}

相信编译器可以形成高效的代码——或者使用更好的编译器。


OP 然后形成了一个不同的目标:“以太两个有限浮点值 A 和 B 具有不同的符号,或者其中一个为零。”

当然if (signbit(A) != signbit(B) || A == 0.0 || B == 0.0)满足这个更新的功能没有四舍五入到 0.0 的问题@Eric Postpischilif ( A * B <= 0 ),但可能不满足最有效方式的模糊要求。

形成高效代码并避免过早优化真正万恶之源的最佳方法是查看更大的上下文。


推荐阅读