Java 为什么该值的输出结果总是零?
我正在运行这段代码,但是为什么m的输出结果在这里总是为零 这很奇怪,因为m被初始化为2Java 为什么该值的输出结果总是零?,java,algorithm,Java,Algorithm,我正在运行这段代码,但是为什么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
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 );
}
}
公共类可伸缩性测试{
公共静态void main(字符串[]args){
long oldTime=System.currentTimeMillis();
double[]数组=新的double[100000];
int p=2;
int m=2;
for(int i=0;i
由于您总是将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
这是因为
int
值溢出。下面显示了int
的最大值为2147483647,在第十六次迭代发生时,m
大于该值,因此溢出。这里有一个观察:一旦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.");
}
}
希望这有帮助 我怀疑这也是溢出,但它不会变成0,是吗?应该是-2147483648是的,这就是我发现的。这是一个很好的解释。谢谢你指出这一点!但即使它溢出,它也应该回到负数。这不等于0。12381923这个数字重要吗?或者你只是按一下按钮把它捣碎了?我只是按一下按钮把它捣碎了:)我只是对这个问题做了一个概括,问如果你改变了启动条件会发生什么: