2012-04-15 21 views
1

私は小さな問題を抱えていますが、データの平均値を計算するコードをいくつか持っています。いくつかの異なるコンピュータ(Linuxでいくつか、いくつかの32ビットと他の64ビット)、しかし、私はデータベースの結果を見ると、いくつかの値が等しい必要があります少し異なります。浮動小数点演算の結果が異なります

これは私のプログラムには何の違いもありませんが、なぜこのようになったのだろうと思いました。同じ単語長の浮動小数点演算が同じ結果をもたらすはずです(私は明らかに間違っていました)。

これは私がチェックするために書いた小さなサンプルコードです:

public class Test{ 
    public static void main(String... args){ 
     double counter = 0, value = 1./10; 

     for (int i = 0; i < 1000000; i++){ 
      counter += value; 
     } 

     System.out.println(counter); 
    } 
} 

それは基本的に私は結果が正確ではないであろうことを知って、10分の1000000を求めるが、一部のPCにそれがある数を表示しますそれ以外の場合はわずかに大きな数字が印刷されます。

答えて

5

あなた本当にがこのポストに選ば答えをチェックしてください、あなたはメソッド宣言でstrictfpキーワードを使用する必要があり、すべてのプラットフォームで同じエラーが必要な場合:When should I use the "strictfp" keyword in java?

strictfpのみ動作することに注意してみましょうあなたの現在のブロックでは、コードを伝播しないので、中にいくつかのメソッドを呼び出す場合は(Mathの代わりにStrictMathも使用する必要があります)が必要です。

これがあなたのコードに影響しないならば、厳密な浮動小数点演算には通常の浮動小数点演算よりも高い計算コストがかかる。

+0

strictfpは** java **キーワードですか?私はそれについて聞いたことがありません... – user1335148

+0

うわー、私はこのような長い時間Javaをやっていると私はJavaについて多くを読んだが、私はこのキーワードを聞いたことがない。私を啓発してくれてありがとう。 ^^ –

+0

@ user1335148はい、strictfpはJavaのキーワードです! – Fido

2

私はそれが使用されるコンパイラ最適化技術に依存すると思います。例えば。なしの最適化で、あなたは精度のおそらく損失で、その結果、ほかの多くを得る、関係する業務を理解することができますコンパイラで、全体のループがcounter = value*1000000

doubleの精度で置き換えられる可能性があり、その操作が正確に設定されています言語で

+0

Javaでコンパイラの最適化を手動で設定することはできますか?それともJVMの決定なのでしょうか?その場合は何もできませんでした... – user1335148

+0

はい、あなたは[設定できます](http://developers.sun.com/solaris/articles/options.html)最適化オプション – Attila

+0

このリンクには感謝しています! – user1335148

1

異なるプレート形式には、浮動小数点を表すさまざまな方法があります。

同じ結果を得るには、精度を特定の小数点以下の桁数に制限する必要があります。

関連する問題