0

Javaでの電力計算の方法と、使用可能なメソッドのパフォーマンスに興味がありました。Math.pow()そこで、動作*を確認するための簡単なテストを作成しました^

public static void main(String[] args) {

    int SIZE = 100000000;

    int[] arr1 = new int[SIZE];
    long st1, end1, st2, end2, st3, end3;

    st1 = System.currentTimeMillis();
    for (int i = 0; i < SIZE; i++) {
        arr1[i] = (int) Math.pow(i, 4);
    }
    end1 = System.currentTimeMillis();
    System.out.println("pow: " + (end1 - st1));

    arr1 = new int[SIZE];
    st2 = System.currentTimeMillis();
    for (int i = 0; i < SIZE; i++) {
        arr1[i] = i * i * i * i;
    }
    end2 = System.currentTimeMillis();
    System.out.println("mul: " + (end2 - st2));

    arr1 = new int[SIZE];
    st3 = System.currentTimeMillis();
    for (int i = 0; i < SIZE; i++) {
        arr1[i] = i^4;
    }
    end3 = System.currentTimeMillis();
    System.out.println("  ^: " + (end3 - st3));

    //to prevent optimizations form skipping the calculations
    for (int i = 0; i < SIZE; i++) {
        if (arr1[i] == 1){
            System.out.println(1);
        }
    }
    System.out.println("done");
}

そして、最初の2つの結果が非常に期待されていた場合:

pow: 19253 19128 19205 19145 19185 19130 19162 19177 19191 19157 | 19173
mul: 91 86 91 85 98 90 90 105 87 95 | 92
  ^: 80 85 80 70 60 65 75 60 70 60  | 71

3つ目は少し紛らわしいです。^単純な乗算よりも常に少し速いのはなぜですか?どちらを使用する必要がありますか?

すべてのテストは、同様の条件でJRE1.7を使用して実行されました。

4

2 に答える 2

10

演算子はべき乗を実行していません。^これはビット単位の「排他的論理和」(別名「xor」)です。

100000000の4乗に整数演算を使用すると、誤った結果が得られます。32ビット整数では、これほど大きな数値を格納できません。

Math.pow()浮動小数点演算を使用します。精度の問題により、回答は100%正確ではない場合がありますが、必要な範囲の結果を表すことができる必要があります。

大きな数値の100%正確な値を取得するには、BigIntegerクラスを使用する必要があります。ただし、特に高速ではありません。これは、精度とパフォーマンスを考慮するときに行う必要のあるトレードオフです。

于 2012-12-17T09:15:07.143 に答える
4

^Javaの演算子は、ビット単位の排他的論理和であり、べき関数とは明らかに似ていません。

参照

于 2012-12-17T09:15:37.870 に答える