我在使用IEEE浮点数规则时遇到了一些问题,这似乎阻碍了编译器进行明显的优化。例如,
char foo(float x) {
if (x == x)
return 1;
else
return 0;
}
无法仅返回1进行优化,因为NaN == NaN为false。好吧,我想这样说。
但是,我希望编译器能够帮助我修复一些东西。是否有数学恒等式适用于所有浮点数?例如,如果意味着编译器可以假定它始终成立,我愿意写!(x - x)(虽然这也不是真的)。
我在网上看到了一些关于这种恒等式的参考资料,例如这里,但我没有找到任何组织信息,包括IEEE 754标准的简短扫描。
如果我可以让优化器假设isnormal(x)而不生成其他代码,那么也可以。
显然,我实际上不会在我的源代码中写(x == x),但我有一个设计用于内联的函数。该函数可能被声明为foo(float x, float y),但通常x为0,或y为0,或x和y都为z,等等。浮点数表示屏幕上的几何坐标。这些都是我手动优化愚蠢的东西时从未区分0和(x-x)的情况。因此,在内联我的函数后,我真的不在乎编译器在做什么时IEEE规则,我宁愿让编译器忽略它们。由于我们基本上在进行屏幕绘制,因此舍入差异也不是非常重要。
我认为-ffast-math对我来说不是一种选择,因为该函数出现在头文件中,使用该函数的.c文件不适合使用-ffast-math。