相同的代码+二进制在不同的机器上给出不同的结

时间:2016-05-09 00:46:04

标签: c

我遇到了一个我无法弄清楚的问题。以下是一些展示问题的玩具C代码:

for(int i = 0; i < 10000; i++)
{
  float theta = 2*PI*i/N;
  double s1 = sin(theta);
  double c1 = cos(theta);

  float s3 = s1;
  float c3 = c1;

  float s2 = sin(theta);
  float c2 = cos(theta);

  printf("theta - %f, (s1:%f, c1:%f) (s2:%f c2:%f) (s3:%f c3:%f) diff (s3-s2:%.8f c3-c2:%.8f)\n", theta, s1, c1, s2, c2, s3, c3, s3-s2, c3-c2);
}

我用gcc编译了这个,我在两台机器上运行相同的二进制文件(两者都有Intel处理器,但是型号不同)。由于它是相同的二进制文件,我原本期望获得相同的结果,但事实并非如此:

例如,在机器#1上,这是一个输出:

theta - 2.441646, (s1:0.644177, c1:-0.764876) (s2:0.644177 c2:-0.764876) (s3:0.644177 c3:-0.764876) 
diff (s3-s2:0.00000006 c3-c2:-0.00000006)

在机器#2上:

theta - 2.441646, (s1:0.644177, c1:-0.764876) (s2:0.644177 c2:-0.764876) (s3:0.644177 c3:-0.764876) 
diff (s3-s2:0.00000000 c3-c2:0.00000000)

我有两个问题:

  • 在机器#1上,为什么s2 / s3和c2 / c3不匹配?
  • 更重要的是(对于我的应用程序,我需要这两台机器来生成相同的结果,并且当它们在其他表达式中进一步使用时,这种精度差异会导致更大的差异),为什么结果在整个机器中保持一致?它是相同的二进制文件,因此导致差异的处理器是什么?其他一些数学库?

我希望得到一些解释,指出我正确的方向,谢谢〜

1 个答案:

答案 0 :(得分:0)

有几个因素会影响上述结果,例如

  1. 如果两个CPU模态具有相同的指令集;
  2. 如果两个操作系统都是32位或64位;
  3. 如果您安装了相同版本的运行时库;
  4. 或其他什么......
  5. 因此。理论上,如果它们是相同的,结果应该是相同的......