2013-06-13 3 views
2

Я запускаю этот код, но почему результат вывода 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); 
    } 

} 
+0

Является ли число 12,381,923 значимым? Или вы просто запустили это? – templatetypedef

+0

Я просто нажал кнопку для пейджа :) –

+0

Я просто спросил об обобщении этого вопроса, который спрашивает, что произойдет, если вы измените условия запуска: http://stackoverflow.com/q/17096161/501557 – templatetypedef

ответ

8

Поскольку вы всегда умножив значение m с номером и добавить к m, на 16-й итерации перетекает стать 0.

Фактически, поскольку вы умножаете число с нечетным числом, добавьте его в оригинал, вы умножаете его на четное число, которое делает завершающие бит 0 перемещением по крайней мере на один шаг влево, таким образом, оно заканчивается 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 
+0

7 итераций? Я получил 16 ... – templatetypedef

+0

Я подозреваю, что это переполнение тоже, но это не будет 0, не так ли? он должен идти до -2147,483,648 –

+0

Да, это то, что я нашел. – templatetypedef

0

это происходит потому, что int значение переполняется. Нижеследующее documentation показывает, что максимальное значение int равно 2,147,483,647, а к тому моменту, когда шестнадцатая итерация происходит, m больше этого значения и, следовательно, переполняется.

+2

Но даже если он переполняется, он должен обернуться вокруг отрицательного числа. Это не сделало бы 0. – templatetypedef

4

Вот наблюдение: как только m достигает 0, выполнение

m += m * 12381923; 

будет держать m на 0.

Я написал программу для вывода значения 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."); 
    } 
} 

Надеюсь, это поможет!

Смежные вопросы