我已经阅读了这个问题,可以确定使用相同输入(在相同的硬件上,使用相同的编译器)进行浮点运算的进程应该是确定性的。我正在研究一个不满足这一条件的情况,并试图确定是什么原因导致了这种情况。
我已经编译了一个可执行文件,并向其提供完全相同的数据,在单台机器上运行(非多线程),但出现了约为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四核处理器上运行。