Ste*_*ven 2 c++ floating-point optimization compare ieee
我正在研究一个平台,当将浮点数与零进行比较时,它会有可怕的停顿.作为优化,我看到使用了以下代码:
inline bool GreaterThanZero( float value )
{
const int value_as_int = *(int*)&value;
return ( value_as_int > 0 );
}
Run Code Online (Sandbox Code Playgroud)
看着生成的组件,档位消失了,功能更加高效.
这有用吗?我很困惑,因为IEEE技巧的所有优化都使用SIGNMASKS和许多AND/OR操作(例如http://www.lomont.org/Math/Papers/2005/CompareFloat.pdf).对有符号int的强制转换是否有帮助?在简单的线束中进行测试没有发现问题.
任何见解都会很好.
表达式*(int*)&value > 0
测试if是否value
是任何正浮点数,从最小的正正规数(具有相同的表示0x00000001
)到最大的有限浮点数(具有表示0x7f7fffff
)和+inf
(具有相同的表示0x7f800000
).该技巧检测到多个(但不是全部)NaN表示为正数(上面的NaN表示0x7f800001
).如果您不关心某些NaN值使测试成立,那就没问题了.
这一切都有效,因为IEEE 754格式的表示.
您在文献中看到的用于模拟IEEE 754操作的位操作功能可能旨在完美仿真,同时考虑到NaN
零点和零点的特定行为.例如,变体*(int*)&value >= 0
不等同于value >= 0.0f
,因为-0.0f
,表示为0x80000000
无符号整数,因此与有符号整数一样-0x80000000
,后者条件为真,前者为假.这可能使这些功能变得非常复杂.
演员是签名
int
帮助吗?
嗯,是的,因为符号位float
,并int
在同一个地方,都表明当一个正数未设置.但是这个条件value > 0.0f
也可以通过重新解释value
为无符号整数来实现.
注意:转换为break int*
的地址value
严格别名规则,但如果你的编译器保证它给这些程序带来意义(可能使用命令行选项),这可能是可以接受的.