gcc的快速math实际上做了什么?

我明白--ffast-math标志可以大大提高浮动操作的速度,并超出IEEE标准,但我似乎无法find真正发生的事情的信息。 任何人都可以请解释一些细节,也许给一个明确的例子,如果国旗是打开或closures如何将改变?

我也尝试过类似的问题,但是找不到任何解释ffastmath运作的东西。

正如你所提到的,它允许优化,不保持严格的IEEE符合性。

一个例子是:

 x = x*x*x*x*x*x*x*x; 

 x *= x; x *= x; x *= x; 

由于浮点运算不是关联的,操作的sorting和因式分解会影响结果。 因此,这种优化不是在严格的FP行为下完成的。

编辑:我没有实际检查,看看GCC实际上是否做这个特别的优化。 但是这个想法是一样的。

-ffast-math不仅仅违反了严格的IEEE标准。

首先,它确实违反了严格的IEEE标准,例如允许对指令进行重新sorting,使其在math上相同(理想情况下),但在浮点上不完全相同。

其次,它禁止在单指令math函数之后设置errno ,这意味着避免写一个线程局部variables(这可以使某些体系结构上的这些函数有100%的差别)。

第三,它假设所有的math都是有限的 ,这意味着不会检查NaN(或零),以至于会产生不利的影响。 简单地假设这不会发生。

第四,它可以实现分数倒数近似和倒数平方根。

此外,它禁止有符号零(代码假定有符号零不存在,即使目标支持它)和四舍五入math,这使得除了其他事情之外,在编译时不断折叠。

最后,它生成的代码假定没有硬件中断可能会发生由于信号/陷阱math(也就是说,如果这些不能在目标架构上被禁用,并因此发生 ,他们将不会被处理)。