本文介绍了在i7-3770和i7-4790的x64下,c ++ exp函数的结果不同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

When I execute a simple x64 application with the following code, I get different results on Windows PCs with a i7-3770 and i7-4790 CPU.

#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的结果:

Result on i7-3770:

3.5677476354876406e-05

i7上的结果-4790:

Result on i7-4790:

3.5677476354876413e-05

当我修改代码以调用

unsigned int control_word;
_controlfp_s(&control_word, _RC_UP, MCW_RC);

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

before the exp function call, both CPUs deliver the same results.

我的问题:


  • 有人问过i7-3770和i7之间差异的原因吗? -4790?

  • 是否可以在Visual Studio 2015/2017 C ++项目中为整个项目设置浮点精度或一致性,而不仅限于以下函数调用? 浮点模型设置(/ fp)对此处的结果没有任何影响。

推荐答案

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

I did some further investigations and I found out the following facts:


  • 在使用不同编译器的Windows上也确实出现了问题(英特尔)

  • 在linux系统上,两个值相等

我也发布了此问题到Visual Studio社区。我得到的信息是,Haswell和更新的CPU使用FMA3。您可以在程序开始时通过 _set_FMA3_enable(0)禁用此功能。当我这样做时,结果是相同的。

I also posted this question to the Visual Studio Community. I got the information, that Haswell and newer CPUs use FMA3. You can disable this feature with _set_FMA3_enable(0) at the beginning of the program. When I do this, the results are the same.

这篇关于在i7-3770和i7-4790的x64下,c ++ exp函数的结果不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-15 04:43