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つのマシンが同じ結果を出すために必要なアプリケーションで、他のエクスプレッションで使用されたときにこの精度差が大きくなるためです)、マシン間で一貫性のある結果が得られるのはなぜですか?それは同じバイナリなので、その違いを引き起こしているのはプロセッサですか?他の数学ライブラリですか?
私はあなたに感謝し、正しい方向に私を指すように、いくつかの説明が大好きだ〜
まず、高速/高精度の数学についてのgccフラグをチェックすることをお勧めします。それでは、生成されたアセンブラコードを見ると意味があります。 –
浮動小数点 - あなたはそれを愛するべきです。 –
さらに数字に一貫した結果が必要な場合は、 'double'を使うことも考えてください。 –