1

私は小さな問題を抱えています。与えられたデータセットから平均値を計算するコードがいくつかあります。これをいくつかの異なるコンピューター (Linux を使用するもの、Windows を使用するもの、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);
    }
}

基本的には1000000 / 10を計算します。結果が正確ではないことはわかっていますが、一部のPCでは100000よりわずかに小さい数値を出力し、他の場合はわずかに大きい数値を出力します。

4

3 に答える 3

5

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

現在のブロックでのみ機能し、コードを介して伝播しないことに注意しstrictfpてください。そのため、途中でいくつかのメソッドを呼び出す場合は、それらも持つ必要がありstrictfpます(また、StrictMathの代わりに使用する必要がありますMath)。

とにかく、これがコードに影響を与えていない場合は、そのままにしておいてください...厳密な浮動小数点演算は、通常の浮動小数点演算よりも計算コストが高くなります。

于 2012-04-15T22:45:50.443 に答える
2

使用されるコンパイラの最適化手法に依存すると思います。たとえば、最適化を行わないと、多くの追加が行われ、精度が失われる可能性があります。関連する操作を理解できるコンパイラを使用すると、ループ全体が次のように置き換えられる可能性があります。counter = value*1000000

の精度doubleとその操作は、言語で正確に設定されます

于 2012-04-15T22:37:09.823 に答える
1

プレート形式が異なれば、浮動小数点を表す方法も異なります。

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

于 2012-04-15T22:41:32.693 に答える