在for循环中使用Double.POSITIVE_INFINITY(Java)

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)

此代码是否会按预期运行(永远循环)或在某些时候失败,为什么?

谢谢.

Pau*_*ton 6

在某些时候,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)

  • @Samir它没有效果.它并非"暗中"保留某处的增长; 一旦"我"变得足够大,就没有任何变化.一旦`i`达到该值,它就会_stops彻底改变_. (2认同)

das*_*ght 5

此代码永远不会退出循环.

原因是添加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,这意味着++不再更改该值.

  • @Samir将一个添加到一个大数字没有任何效果.一旦浮点单元看到被添加的两个数字的指数将它们的尾数放入不相交的范围,单位就会停止,并返回较大数字的值. (2认同)