2

このコードを実行しているのですが、ここで m の出力結果が常にゼロになるのはなぜですか?

m が 2 に初期化されているため、これは非常に奇妙です。

public class ScalabilityTest {

public static void main(String[] args) {
    long oldTime = System.currentTimeMillis();
    double[] array = new double[100000];
    int p = 2;
    int m = 2;
    for ( int i = 0; i < array.length; i++ ) {
        p += p * 12348;
        for ( int j = 0; j < i; j++ ) {
            double x = array[j] + array[i];
            m += m * 12381923;
        }
    }

    System.out.println( (System.currentTimeMillis()-oldTime) / 1000 );
    System.out.println( p + ", " + m );
    }

}
4

3 に答える 3

8

常に の値に数値を掛けて にm加算してmいるため、16 回目の反復でオーバーフローして になり0ます。

実際、数値に奇数を掛けてから元に追加しているので、偶数を掛けているため、末尾の0ビットが少なくとも 1 ステップ左に移動するため、次のように終了し0ます。

1 1011110011101110111001000 24763848
2 1111011100110010111011000100000 2073654816
3 1111111111111101111010010000000 2147415168
4 10010100011000001100001000000000 -1805598208
5 10010010100010001100100000000000 -1836529664
6 10001011110000100010000000000000 -1950212096
7 1110010101001001000000000000000 1923383296
8 1001100000100000000000000000 159514624
9 1010011110010000000000000000000 1405616128
10 10001110001000000000000000000000 -1910505472
11 1010100100000000000000000000000 1417674752
12 1000010000000000000000000000000 1107296256
13 11001000000000000000000000000000 -939524096
14 100000000000000000000000000000 536870912
15 10000000000000000000000000000000 -2147483648
16 0 0
于 2013-06-13T20:01:29.370 に答える
4

mここに観察があります: 0に達するとすぐに、実行します

m += m * 12381923;

0 のままにしますm

mの値をそのまま出力するプログラムを書いたところ、次のような結果が得られました。

2
24763848
2073654816
2147415168
-1805598208
-1836529664
-1950212096
1923383296
159514624
1405616128
-1910505472
1417674752
1107296256
-939524096
536870912
-2147483648
0
Converged after 16 iterations.

参考までに、ソースは次のとおりです。

public class Converge {
    public static void main(String[] args) {
        int m = 2;
        long counter = 0; // Unnecessary, but I didn't know how many iterations we'd need!

        while (m != 0) {
            System.out.println(m);
            m += m * 12381923;
            counter++;
        }
        System.out.println(m);
        System.out.println("Converged after " + counter + " iterations.");
    }
}

お役に立てれば!

于 2013-06-13T20:02:28.123 に答える
0

int値がオーバーフローするためです。次のドキュメントは、 an の最大値intが 2,147,483,647 であり、16 回目の反復が発生するまでに、mこの値よりも大きくなり、オーバーフローすることを示しています。

于 2013-06-13T20:01:51.227 に答える