Sam*_*mir 8 java for-loop infinity
以下代码将如何表现,尤其是当双计数器达到其极限时((2-2 ^ -52)·2 ^ 1023)?
for (double i = 0; i < Double.POSITIVE_INFINITY; i++){
//do something
}
Run Code Online (Sandbox Code Playgroud)
此代码是否会按预期运行(永远循环)或在某些时候失败,为什么?
谢谢.
在某些时候,i++将停止产生任何影响,因为对于非常大的值i,连续double值相差很远.
因此它是一个无限循环.
为了证明有价值double,i == i + 1试试这个:
for (double i = 1;; i *= 2){
if (i == i + 1) {
System.out.println(i);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
它打印
9.007199254740992E15
Run Code Online (Sandbox Code Playgroud)
此代码永远不会退出循环.
原因是添加1足够大的double数字不会改变其值:
double a = 1.7976931348623155E308;
double old = a;
a++;
System.out.println(a); // prints 1.7976931348623155E308
System.out.println(old); // prints 1.7976931348623155E308
System.out.println(a==old); // prints "true"
Run Code Online (Sandbox Code Playgroud)
事实上,当值double足够接近正无穷大时,你需要添加一个远高于10 200的数字,以便使你的大的双变化值成为POSITIVE_INFINITY.
原因是这种方式double代表了大量的数字.它使用短尾数来表示值的最高有效位,并使用指数来指示应该放置小数点的位置.在数字非常大的情况下,指数基本上表示在尾数的二进制表示之后需要添加多少个零.
为了double通过添加来改变数字值,您需要添加一个至少与尾数的最低有效位一样大的数字.一旦二进制指数超过48,为了使结果不同而需要添加的最小数字变为2,这意味着++不再更改该值.