通过作弊快速比较IEEE浮点数大于零

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的强制转换是否有帮助?在简单的线束中进行测试没有发现问题.

任何见解都会很好.

Pas*_*uoq 6

表达式*(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严格别名规则,但如果你的编译器保证它给这些程序带来意义(可能使用命令行选项),这可能是可以接受的.