我正在处理一个平台,在比较浮点数和零时会出现可怕的停顿。作为优化,我看到了以下代码的使用:
inline bool GreaterThanZero( float value )
{
const int value_as_int = *(int*)&value;
return ( value_as_int > 0 );
}
看生成的汇编代码,停顿已经消失了,函数性能更好了。
这样做有用吗?我很困惑,因为所有针对IEEE技巧的优化都使用SIGNMASKS和大量的AND/OR操作(例如:https://www.lomont.org/papers/2005/CompareFloat.pdf)。将其强制转换为有符号整数是否有帮助?在简单的测试中没有发现问题。
任何见解都会很好。
f > 0
这样简单的东西真的不会做最优化处理吗? - Barry> 0
...有点可疑,但对于许多应用程序可能是可以接受的。在wikipedia上有许多关于位布局的细节。 - Tony Delroy!(x <= 0)
而不是x > 0
。 - tmyklebu<
,<=
,>
,>=
和==
始终返回false。(实际上,再思考十秒钟,他也没有实现比较!(x <= 0)
。对于有限的x
,它是x> 0
,对于某些NaN是true,但对于其他NaN则不是。 - tmyklebu