当我使用以下代码执行简单的x64应用程序时,在使用i7-3770和i7-4790 CPU的Windows PC上获得不同的结果。
3.5677476354876406e-05
i7-3770的结果:
3.5677476354876413e-05
i7-4790的结果:
unsigned int control_word;
_controlfp_s(&control_word, _RC_UP, MCW_RC);
当我修改要调用的代码时
forEach
在exp函数调用之前,两个CPU都会提供相同的结果。
我的问题:
答案 0 :(得分:2)
假设使用IEEE-754编码double,并使用此decimal to binary converter,您可以看到:
3.5677476354876406e-05以hexa表示为0x3F02B48CC0D0ABA8 3.5677476354876413e-05以hexa表示为0x3F02B48CC0D0ABA9
仅在最后一位有所不同,可能是由于圆误差。
答案 1 :(得分:1)
我做了一些进一步的调查,我发现了以下事实:
我还将此问题发布到Visual Studio社区。我得到的信息是,Haswell和较新的CPU使用FMA3。您可以在程序开头使用 _set_FMA3_enable(0)禁用此功能。当我这样做时,结果是一样的。