![](/img/trans.png)
[英]Using Double.POSITIVE_INFINITY in Java to find minimum value
[英]Using Double.POSITIVE_INFINITY in for loop (Java)
以下代碼將如何表現,尤其是當雙計數器達到其極限時((2-2 ^ -52)·2 ^ 1023)?
for (double i = 0; i < Double.POSITIVE_INFINITY; i++){
//do something
}
此代碼是否會按預期運行(永遠循環)或在某些時候失敗,為什么?
謝謝。
在某些時候, i++
將停止產生任何影響,因為對於非常大的i
值,連續的double
值相差很遠。
因此它是一個無限循環。
要證明有i == i + 1
double
值,請嘗試:
for (double i = 1;; i *= 2){
if (i == i + 1) {
System.out.println(i);
break;
}
}
它打印
9.007199254740992E15
此代碼永遠不會退出循環。
原因是將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"
實際上,當double
的值足夠接近正無窮大時,您需要添加一個遠高於10 200的數字 ,以便使您的大的雙變化值變為POSITIVE_INFINITY
。
原因是double
表示大數字的方式。 它使用短尾數來表示值的最高有效位,並使用指數來指示應該放置小數點的位置。 在數字非常大的情況下,指數基本上表示在尾數的二進制表示之后需要添加多少個零。
為了通過加法使您的double
數字更改值,您需要添加一個至少與尾數的最低有效位一樣大的數字。 一旦二進制指數超過48,為了使結果不同而需要添加的最小數字變為2,這意味着++
將不再更改該值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.