当我使用以下代码执行简单的x64应用程序时,在具有i7-3770和i7-4790 CPU的Windows PC上,我得到了不同的结果。

#include <cmath>
#include <iostream>
#include <limits>

void main()
{
  double val = exp(-10.240990982718174);
  std::cout.precision(std::numeric_limits<double>::max_digits10);
  std::cout << val;
}

在i7-3770上的结果:
3.5677476354876406e-05

在i7-4790上的结果:
3.5677476354876413e-05

当我修改要调用的代码
unsigned int control_word;
_controlfp_s(&control_word, _RC_UP, MCW_RC);

在调用exp函数之前,两个CPU都提供相同的结果。

我的问题:
  • 是否有人会因为i7-3770和i7-4790之间的差异而有想法?
  • 是否可以为整个项目而不是仅针对以下函数调用在Visual Studio 2015/2017 C++项目中设置浮点精度或一致性? “浮点模型”设置(/ fp)对此处的结果没有任何影响。
  • 最佳答案

    假设double是使用IEEE-754和decimal to binary converter编码的,则可以看到:



    它们仅在最后一位不同,可能是由于舍入误差。

    09-08 04:09