我知道 gcc 的--ffast-math标志可以大大提高浮动操作的速度,并且超出了 IEEE 标准,但我似乎无法找到有关它开启时实际发生的情况的信息。任何人都可以解释一些细节,并给出一个明确的例子,说明如果标志打开或关闭,事情会如何变化?
--ffast-math
我确实尝试通过 SO 挖掘类似的问题,但找不到任何解释 ffast-math 工作原理的东西。
正如您所提到的,它允许不保持严格的 IEEE 合规性的优化。
一个例子是这样的:
x = x*x*x*x*x*x*x*x;
至
x *= x; x *= x; x *= x;
由于浮点运算不是关联的,因此运算的排序和因式分解会因舍入而影响结果。因此,这种优化不是在严格的 FP 行为下进行的。
我实际上并没有检查 GCC 是否真的做了这个特定的优化。但想法是一样的。