我試圖Double.POSITIVE_INFINITY == Float.POSITIVE_INFINITY
System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY))
System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY));
輸出功率爲
true
true
因此,這意味着 「無限」 是兩種數據類型相同?
我試圖Double.POSITIVE_INFINITY == Float.POSITIVE_INFINITY
System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY))
System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY));
輸出功率爲
true
true
因此,這意味着 「無限」 是兩種數據類型相同?
是和否。是的,因爲在抽象意義上,無窮大是無窮的(並且,正如我在下面解釋的,對於大多數代碼而言,浮點數轉換爲雙精度)。
沒有,不過,由於在位級兩個無窮大是不同。 Java中的double是64位,而Java中的float是32位,所以它們在代表級別上不同。
在Java中,浮點數(浮點數和雙精度數)使用浮點格式IEEE 754表示,這是幾乎每個人現在使用的標準。每個數字以二進制表示爲符號位,加上一定數量的指數位,加上一定數量的尾數(有效位)位。無論是浮點型還是雙精度型,正無窮都用0表示,符號位爲0,指數位爲1,尾數位爲0.除了符號位爲1以外,負無窮表示方式相同。因此無窮大表示爲兩種非常相似的方式,但由於浮點數和雙精度之間的指數位和尾數位數不同,位級模式不同。
對於編寫代碼的目的,你可以把它們當作是相同的。每當你使用雙精度和浮點數時,除非明確指出否則浮點數將自動轉換爲雙精度值,並且表達式將導致雙精度浮點數,所以浮點無窮大就像大多數實際用途中的「雙無窮大」一樣。
這取決於你所說的「同」是什麼。位模式不同,因爲符號不同,但他們仍然無限。
此外,花車促銷規則轉換爲雙時將保留無限性。
「同一」我的意思是如果你把這兩者的差異,你會得到零。我沒有檢查兩種情況下的位模式。但它們不應該是相同的,因爲這是Double.compare(...)方法所依賴的? – user113454 2012-04-10 05:18:13
@ user1064918不,位模式不一樣,因爲浮點數是32位,雙數是64位。此外,如果你把這兩者區別開來,你會得到NaN,因爲Infinity - Infinity在數學上也不是數字。 – 2012-04-10 05:21:15
@ user1064918:實際上,Float.POSITIVE_INFINITY Float.POSITIVE_INFINITY也是'NaN',就像'Float.POSITIVE_INFINITY + Float.NEGATIVE_INFINITY'一樣。無論您使用哪種數據類型,都沒有定義兩個無限的減法。 – Amadan 2012-04-10 05:23:45
在Java中,你不能直接比較有float
一個double
。相反,當您嘗試這樣做時,float
會先自動轉換爲double
。當您將float
傳遞給採用double
參數的方法時,會發生同樣的問題。當您將Float.POSITIVE_INFINITY
(例如)轉換爲double
時,您將獲得Double.POSITIVE_INFINITY
。
所以回答你的問題是,Double.POSITIVE_INFINITY
和Float.POSITIVE_INFINITY
不完全是一回事,但他們均表示「一個數字,太大而無法表示」,因此答案是==
讓你在邏輯上是一致的。
沒有辦法到float
與double
在Java中比較這樣。所有你可能使用的操作與double
後implcitly向上轉型的float
到double
float f=
double d =
Double.compare(f, d);
// equivelent to
Double.compare((double) f, d);
我看到比較
double
。並且'Double.compare(double,double)'方法會很聰明(或者,也許愚蠢?)足以返回'Double.compare(Float.POSITIVE_INFINITY,Double.POSITIVE_INFINITY)'? – user113454 2012-04-10 05:36:59@ user1064918這與Double無關。比較(雙,雙)'。正如我在我的答案中所暗示的那樣,無論在哪裏需要double並提供一個float,float都會自動轉換爲double,所以'Double.compare(double,double)'只能看到兩個double。 * JVM和硬件*足夠智能,可識別32位無限(浮點)並將其轉換爲64位無限(雙精度)。 – 2012-04-10 05:50:24
這很有道理。謝謝 – user113454 2012-04-10 05:54:14