我在 IEEE 浮点规则方面遇到了一些问题,这些规则阻止了看起来很明显的编译器优化。例如,
char foo(float x) {
if (x == x)
return 1;
else
return 0;
}
不能优化为只返回 1,因为 NaN == NaN 为假。好吧,好吧,我猜。
但是,我想编写这样的代码,优化器实际上可以为我解决问题。是否存在适用于所有浮点数的数学恒等式?例如,我愿意写 !(x - x) 如果这意味着编译器可以假设它一直保持不变(尽管情况并非如此)。
我在网络上看到了一些对此类身份的引用,例如这里,但我没有找到任何有组织的信息,包括对 IEEE 754 标准的简单扫描。
如果我能让优化器假设 isnormal(x) 而不生成额外的代码(在 gcc 或 clang 中),那也很好。
显然,我实际上并不打算在我的源代码中编写 (x == x),但我有一个专为内联而设计的函数。该函数可以声明为 foo(float x, float y),但通常 x 为 0,或 y 为 0,或 x 和 y 均为 z 等。浮点数表示屏幕上的几何坐标。在这些情况下,如果我在不使用函数的情况下手动编码,我永远不会区分 0 和 (x - x),我只会手动优化愚蠢的东西。所以,我真的不关心编译器在内联我的函数后所做的 IEEE 规则,我只想让编译器忽略它们。舍入差异也不是很重要,因为我们基本上是在屏幕上绘图。
我不认为 -ffast-math 对我来说是一个选项,因为该函数出现在头文件中,并且使用该函数的 .c 文件与 -ffast-math 一起编译是不合适的。