c - 使用 IEEE 浮点优化 - 保证数学恒等式?

标签 c performance optimization floating-point numerical

我在 IEEE 浮点规则方面遇到了一些问题,阻止了看似显而易见的编译器优化。例如,

char foo(float x) {
    if (x == x) 
       return 1;
    else 
       return 0; 
}

无法优化为仅返回 1,因为 NaN == NaN 为假。好吧,好吧,我想。

但是,我想编写这样的优化器实际上可以为我修复问题。是否存在适用于所有 float 的数学恒等式?例如,我愿意写 !(x - x) 如果这意味着编译器可以假设它一直成立(尽管事实并非如此)。

我在网络上看到一些对此类身份的引用,例如 here ,但我没有找到任何有组织的信息,包括对 IEEE 754 标准的简单扫描。

如果我能让优化器在不生成额外代码(在 gcc 或 clang 中)的情况下假设 isnormal(x) 也很好。

很明显,我实际上并不打算在我的源代码中编写 (x == x),但我有一个专为内联而设计的函数。该函数可以声明为 foo(float x, float y),但通常 x 为 0,或 y 为 0,或 x 和 y 均为 z,等等。 float 表示屏幕上的几何坐标。在这些情况下,如果我在不使用函数的情况下手动编码,我永远不会区分 0 和 (x - x),我只会手动优化愚蠢的东西。所以,我真的不关心 IEEE 规则关于编译器在内联我的函数后所做的事情,我希望编译器尽快忽略它们。舍入差异也不是很重要,因为我们基本上是在进行屏幕绘图。

我认为 -ffast-math 不适合我,因为该函数出现在头文件中,使用该函数的 .c 文件使用 -ffast-math 编译是不合适的。

最佳答案

另一个可能对您有用的引用是 Yossarian King 在《游戏编程精粹》第 2 卷中关于浮点优化的一篇非常好的文章。您可以阅读文章here .它非常详细地讨论了 IEEE 格式,考虑了实现和体系结构,并提供了许多优化技巧。

关于c - 使用 IEEE 浮点优化 - 保证数学恒等式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973189/

相关文章:

excel - 循环遍历 ListObject 中的行来删除它们非常慢

performance - 随机SVD奇异值

android - 优化 Android 中的 onDraw - 哪个区域正在重绘?

c# - C#中如何对 float 进行四舍五入

c - 如何测试 POSIX 兼容性?

c - 如何检测是否有新行然后忽略它(fgets)

c - 在Linux中使用C读取文件时出现段错误

objective-c - 编写许多小方法对 Objective-C 有性能影响吗?

java - 为什么带有两个常量的三元运算符比带有变量的三元运算符快?

c - 从 `std::io::File::open` 获取文件描述符