2016-05-09 34 views
2

私は理解できない問題に遭遇しています。ここでの問題を示し、いくつかのおもちゃの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プロセッサを持っていますが、異なるモデルであり、両方)で同じバイナリを実行しているI'amこれをコンパイルしています。それは同じバイナリなので、私は同じ結果を得ることを期待していたが、これはそうではありません。

例えば、マシン#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:マシン#1で

  • 、なぜS2/S3とC2/C3は一致しない:私は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) 
    

  • もっと重要なのは(これらの2つのマシンが同じ結果を出すために必要なアプリケーションで、他のエクスプレッションで使用されたときにこの精度差が大きくなるためです)、マシン間で一貫性のある結果が得られるのはなぜですか?それは同じバイナリなので、その違いを引き起こしているのはプロセッサですか?他の数学ライブラリですか?

私はあなたに感謝し、正しい方向に私を指すように、いくつかの説明が大好きだ〜

+2

まず、高速/高精度の数学についてのgccフラグをチェックすることをお勧めします。それでは、生成されたアセンブラコードを見ると意味があります。 –

+0

浮動小数点 - あなたはそれを愛するべきです。 –

+0

さらに数字に一貫した結果が必要な場合は、 'double'を使うことも考えてください。 –

答えて

0

2個のCPUモーダルを持っている場合は、いくつかの要因が、このような

  1. として、上記の結果に影響を与える可能性があります。同じ命令がセットされる。
  2. 2つのOSが両方とも32ビットまたは64ビットの場合、
  3. 同じバージョンのランタイムライブラリがインストールされている場合は、
  4. または

So.理論的には、それらが同じであれば、結果は同じでなければなりません。

関連する問題