在GCC中启用严格浮点模式

我还没有创建一个程序来查看GCC是否需要它通过,当我这样做时,我想知道如何启用严格的浮点模式,这将允许运行和计算机之间的可重现结果,谢谢。

在支持它的Intel / AMD处理器上使用-msse2进行编译将使您几乎到达那里。 不要让任何库将FPU置于FTZ / DNZ模式,并且您将大部分设置(尽管处理器错误)。

对于其他架构,答案会有所不同。 那些没有提供任何方便的方法来获得精确的IEEE 754语义(例如,预先SSE2 IA32 CPU)的架构将需要使用浮点仿真库来获得您想要的结果,而且性能会受到很高的影响。

如果您的目标体系结构支持fmadd (没有中间舍入的乘法和加法)指令,请确保在源代码中有明确的乘法和加法时,编译器不会使用它。 除非使用-ffast-math选项,否则GCC不应该这样做。

您还可以在i386 / ia32目标上使用GCC的选项-mpc64 ,即使在x87 FPU上也可以强制进行双精度计算。 请参阅GCC手册 。

您还可以在运行时修改x87 FPU行为,请参阅确定性跨平台浮点运算算法以及GCC简介 。

如果使用-ffloat-store并始终将中间值存储到变量或将(显式)强制转换应用于所需的类型/精度,则应该至少达到目标的90%,甚至更多。 我欢迎评论是否有这种方法仍然遗漏的情况。 请注意,即使没有任何SSE选项,我声称这也有效。