![](/img/trans.png)
[英]Why is there a “d” in the definition of Double.NaN = 0.0d / 0.0?
[英]double d=1/0.0 vs double d=1/0
double d=1/0.0;
System.out.println(d);
它打印Infinity
,但如果我們寫double d=1/0;
並打印它我們會得到這個異常: Exception in thread "main" java.lang.ArithmeticException: / by zero at D.main(D.java:3)
為什么Java在一種情況下知道潛水為零是無窮大但是對於int 0它沒有定義? 在這兩種情況下,d都是雙倍的,在兩種情況下,結果都是無窮大。
浮點數據類型具有保留的特殊值以表示無窮大,而整數值則不保留。
在您的代碼中, 1/0
是一個整數除法,當然會失敗。 但是, 1/0.0
是浮點除法,因此導致Infinity
。
嚴格來說, 1.0/0.0
根本不是無窮大,它是未定義的。
正如大衛在他的回答中所說的那樣,Floats有一種表達一個數字的方式,該數字不在它可以代表的最高數字和最低數字的范圍內。 這些值統稱為“非數字”或僅僅是NaN。 NaNs也可能來自真正無限的計算(例如lim x -> 0 ln 2 x
),值有限但溢出范圍浮點數可以表示(如10 100 100 ),以及未定義的值,如1/0 。
浮點數不能很清楚地區分未定義的值,溢出和無窮大; 該計算產生的比特組合取決於。 由於只是打印“NaN”或“非數字”對於不知道如何表示浮點值的人來說有點難以理解,因此格式化程序只打印“Infinity”或有時“-Infinity”,因為它提供相同的當您知道FP NaN的所有內容時,信息水平,並且當您不知道FP NaN時有一些意義。
整數沒有任何可與浮點NaN相媲美的東西。 因為當你執行1/0時,整數沒有合理的值,所以剩下的唯一選擇是引發異常。
用機器語言編寫的相同代碼可以調用與Java異常相當的中斷,也可以設置條件寄存器,這將是一個全局值,表示最后一次計算是除以零。 其中哪些可用的平台有點不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.