c++ - 有效检查两个浮点值是否具有不同的符号
问题描述
我需要找出两个有限浮点值是否具有不同A
的B
符号或其中一个是否为零。
在许多代码示例中,我看到测试如下:
if ( (A <= 0 && B >= 0) || (A >= 0 && B <= 0) )
它工作正常,但对我来说似乎效率低下,因为这里验证了许多条件,并且每个条件分支对于现代 CPU 来说都是一个缓慢的操作。
另一种选择是使用浮点值的乘法:
if ( A * B <= 0 )
即使在溢出的情况下它也应该工作,因为无穷大值保留了正确的符号。
执行检查的最有效方法是什么(这两个之一或可能其他一些)?
解决方案
有效检查两个浮点值是否具有不同的符号
if ( A * B <= 0 )
无法区分标志何时A
或B
属于集合-0.0, +0.0
。
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 Postpischil的if ( A * B <= 0 )
,但可能不满足最有效方式的模糊要求。
形成高效代码并避免过早优化真正万恶之源的最佳方法是查看更大的上下文。
推荐阅读
- javascript - 用于 javascript Mediasource 的 MP3 到 MP4
- python - sqlite3 搜索数据库
- arrays - UserDefaults 不会正确检索我的字符串数组
- php - 如何发布添加表?
- html - Bootstrap 4 左右对齐 div,对于小屏幕,将它们显示在单独的行中
- r - 我想在 R 中复制相同的 SAS,感谢您的输入
- php - How to get the number of rows in database based on few parameters
- angular - 按下退出按钮时防止关闭 Angular Material 对话框,但单击背景时允许关闭
- javascript - 在Javascript中按日期过滤数组
- jmeter - JMeter 并行控制器有两个事务控制器问题