c ++ exp函数在i7-3770和i7-4790上的x64下有不同的结果

时间:2017-08-22 15:22:24

标签: c++ 64-bit precision exp

当我使用以下代码执行简单的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都会提供相同的结果。

我的问题:

  • 有没有人知道i7-3770和i7-4790之间存在差异的原因?
  • 有没有办法在整个项目的Visual Studio 2015/2017 C ++项目中设置浮点精度或一致性,而不仅仅是以下函数调用? "浮点模型"设置(/ fp)对结果没有任何影响。

2 个答案:

答案 0 :(得分:2)

假设使用IEEE-754编码double,并使用此decimal to binary converter,您可以看到:

  

3.5677476354876406e-05以hexa表示为0x3F02B48CC0D0ABA8   3.5677476354876413e-05以hexa表示为0x3F02B48CC0D0ABA9

仅在最后一位有所不同,可能是由于圆误差。

答案 1 :(得分:1)

我做了一些进一步的调查,我发现了以下事实:

  • 在具有不同编译器(Intel)的Windows上也会出现此问题
  • Linux系统上的
  • 两个值相等

我还将此问题发布到Visual Studio社区。我得到的信息是,Haswell和较新的CPU使用FMA3。您可以在程序开头使用 _set_FMA3_enable(0)禁用此功能。当我这样做时,结果是一样的。