2012-04-10 39 views

回答

8

是和否。是的,因爲在抽象意義上,無窮大是無窮的(並且,正如我在下面解釋的,對於大多數代碼而言,浮點數轉換爲雙精度)。

沒有,不過,由於在位級兩個無窮大是不同。 Java中的double是64位,而Java中的float是32位,所以它們在代表級別上不同。

在Java中,浮點數(浮點數和雙精度數)使用浮點格式IEEE 754表示,這是幾乎每個人現在使用的標準。每個數字以二進制表示爲符號位,加上一定數量的指數位,加上一定數量的尾數(有效位)位。無論是浮點型還是雙精度型,正無窮都用0表示,符號位爲0,指數位爲1,尾數位爲0.除了符號位爲1以外,負無窮表示方式相同。因此無窮大表示爲兩種非常相似的方式,但由於浮點數和雙精度之間的指數位和尾數位數不同,位級模式不同。

對於編寫代碼的目的,你可以把它們當作是相同的。每當你使用雙精度和浮點數時,除非明確指出否則浮點數將自動轉換爲雙精度值,並且表達式將導致雙精度浮點數,所以浮點無窮大就像大多數實際用途中的「雙無窮大」一樣。

+0

我看到比較double。並且'Double.compare(double,double)'方法會很聰明(或者,也許愚蠢?)足以返回'Double.compare(Float.POSITIVE_INFINITY,Double.POSITIVE_INFINITY)'? – user113454 2012-04-10 05:36:59

+1

@ user1064918這與Double無關。比較(雙,雙)'。正如我在我的答案中所暗示的那樣,無論在哪裏需要double並提供一個float,float都會自動轉換爲double,所以'Double.compare(double,double)'只能看到兩個double。 * JVM和硬件*足夠智能,可識別32位無限(浮點)並將其轉換爲64位無限(雙精度)。 – 2012-04-10 05:50:24

+0

這很有道理。謝謝 – user113454 2012-04-10 05:54:14

1

這取決於你所說的「同」是什麼。位模式不同,因爲符號不同,但他們仍然無限。

此外,花車促銷規則轉換爲雙時將保留無限性。

+0

「同一」我的意思是如果你把這兩者的差異,你會得到零。我沒有檢查兩種情況下的位模式。但它們不應該是相同的,因爲這是Double.compare(...)方法所依賴的? – user113454 2012-04-10 05:18:13

+3

@ user1064918不,位模式不一樣,因爲浮點數是32位,雙數是64位。此外,如果你把這兩者區別開來,你會得到NaN,因爲Infinity - Infinity在數學上也不是數字。 – 2012-04-10 05:21:15

+1

@ user1064918:實際上,Float.POSITIVE_INFINITY Float.POSITIVE_INFINITY也是'NaN',就像'Float.POSITIVE_INFINITY + Float.NEGATIVE_INFINITY'一樣。無論您使用哪種數據類型,都沒有定義兩個無限的減法。 – Amadan 2012-04-10 05:23:45

1

在Java中,你不能直接比較有float一個double。相反,當您嘗試這樣做時,float會先自動轉換爲double。當您將float傳遞給採用double參數的方法時,會發生同樣的問題。當您將Float.POSITIVE_INFINITY(例如)轉換爲double時,您將獲得Double.POSITIVE_INFINITY

所以回答你的問題是,Double.POSITIVE_INFINITYFloat.POSITIVE_INFINITY不完全是一回事,但他們均表示「一個數字,太大而無法表示」,因此答案是==讓你在邏輯上是一致的。

1

沒有辦法到floatdouble在Java中比較這樣。所有你可能使用的操作與double後implcitly向上轉型的floatdouble

float f= 
double d = 
Double.compare(f, d); 
// equivelent to 
Double.compare((double) f, d); 
相關問題