Fed*_*dor 5 c floating-point optimization clang fma
如clang 14.0.0 浮点优化的答案所示,自版本 14 起,Clang 即使对于在编译时执行的常量计算也应用融合乘法加法 (FMA) 指令。
同时,我们可以观察到结果取决于表达式参数的形式恒定性:
#include <stdio.h>
int main() {
const float A = 2.1f;
const float B = 0.1f;
float C = 0.1f;
float V = A * B - A * B;
float W = A * C - A * C;
printf( "%g %g", V, W );
}
Run Code Online (Sandbox Code Playgroud)
在 Clang 中,程序打印0 1.49011e-10
,在线演示:https://godbolt.org/z/a3fcYG7ob
从汇编代码可以看出, 和V
都是W
在编译时求值的。是否有一些规则规定只能W
使用 FMA 指令进行评估?
添加-mno-fma
用于禁用 FMA 指令的命令行选项不会改变结果中的任何内容。