我还没有创建一个程序来查看GCC是否需要它通过,当我这样做时,我想知道如何启用严格的浮点模式,这将允许运行和计算机之间的可重现结果,感谢。
答案 0 :(得分:5)
在支持它的Intel / AMD处理器上使用-msse2
进行编译将使您几乎到达那里。不要让任何库将FPU置于FTZ / DNZ模式,并且您将大部分设置(尽管处理器存在错误)。
对于其他架构,答案会有所不同。那些没有提供任何方便的方法来获得精确的IEEE 754语义(例如,预先SSE2 IA32 CPU)的架构将需要使用浮点仿真库来获得您想要的结果,而且性能会受到很高的影响。
如果您的目标体系结构支持fmadd
(没有中间舍入的乘法和加法)指令,请确保在源代码中有明确的乘法和加法时,编译器不会使用它。除非你使用-ffast-math选项,否则GCC不应该这样做。
答案 1 :(得分:2)
您还可以在i386 / ia32目标上使用GCC
选项-mpc64
来强制进行双精度计算,即使在x87 FPU上也是如此。请参阅GCC manual。
您还可以在运行时修改x87 FPU行为,请参阅Deterministic cross-platform floating point arithmetics和An Introduction to GCC。
答案 2 :(得分:1)
如果使用-ffloat-store
并始终将中间值存储到变量或将(显式)强制转换应用于所需的类型/精度,则应至少达到目标的90%,甚至更多。我欢迎评论是否有这种方法仍然遗漏的情况。请注意,即使没有任何SSE选项,我声称这也有效。