已经阅读了这个问题,我有理由确定使用浮点运算和相同输入的给定进程(在相同的硬件上,使用相同的编译器编译)应该是确定性的。我正在研究一个不正确的案例,并试图确定是什么原因造成的。
我已经编译了一个可执行文件,我给它提供了完全相同的数据,在单台机器(非多线程)上运行,但是我得到了大约 3.814697265625e-06 的错误,经过仔细的谷歌搜索,我发现它实际上等于 1 /4^9 = 1/2^18 = 1/262144。这非常接近 32 位浮点数的精度级别(根据维基百科大约 7 位)
我怀疑它与已应用于代码的优化有关。我正在使用英特尔 C++ 编译器,并将浮点推测转为快速而不是安全或严格。这会使浮点过程变得不确定吗?是否有其他优化等可能导致这种行为?
编辑:根据 Pax 的建议,我重新编译了代码,浮点推测转为安全,我现在得到了稳定的结果。这让我可以澄清这个问题——浮点推测实际上做了什么,当应用于完全相同的输入时,这如何导致相同的二进制文件(即一次编译、多次运行)产生不同的结果?
@Ben 我正在使用 Intel(R) C++ 11.0.061 [IA-32] 进行编译,并且在 Intel 四核处理器上运行。