正如答案中所示clang 14.0.0 浮点优化 https://stackoverflow.com/questions/73985098/clang-14-0-0-floating-point-optimizations,自版本 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 );
}
在 Clang 中,程序打印0 1.49011e-10
,在线演示:https://godbolt.org/z/a3fcYG7ob https://godbolt.org/z/a3fcYG7ob
从汇编代码可以看出,两者V
and W
在编译时评估。有没有什么规则规定只能W
可以使用FMA指令进行评估吗?
Adding -mno-fma
用于禁用 FMA 指令的命令行选项不会改变结果中的任何内容。
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)