我需要查找是否有两个有限浮点值A
and B
有不同的符号或其中之一为零。
在许多代码示例中,我看到测试如下:
if ( (A <= 0 && B >= 0) || (A >= 0 && B <= 0) )
它工作正常,但对我来说看起来效率低下,因为这里验证了许多条件,并且每个条件分支对于现代 CPU 来说都是一个缓慢的操作。
另一种选择是使用浮点值的乘法:
if ( A * B <= 0 )
即使在溢出的情况下它也应该起作用,因为无穷大的值保留了正确的符号。
执行检查的最有效方法是什么(这两种之一或可能其他一些)?
有效检查两个浮点值是否具有不同的符号
if ( A * B <= 0 )
无法区分符号时A
or B
是集合中的-0.0, +0.0
.
考虑signbit() https://en.cppreference.com/w/cpp/numeric/math/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 的问题@埃里克·波斯特皮斯基尔 https://stackoverflow.com/questions/68761048/efficient-check-that-two-floating-point-values-have-distinct-signs/68761596#comment121521786_68761048 of if ( A * B <= 0 )
,但可能无法满足模糊要求最有效的方法.
形成高效代码并避免的最佳方式过早的优化确实是万恶之源 https://softwareengineering.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil就是要看到更大的背景。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)