2017-04-26 35 views
5

整數,浮點和長Scala中的最大值爲:什麼是朋友之間的Int.MaxValue?

Int.MaxValue = 2147483647

Float.MaxValue = 3.4028235E38

Long.MaxValue = 9223372036854775807L

來自Scala編譯器的作者,Keynote, PNW Scala 2013,幻燈片16 What's Int.MaxValue between friends?

val x1: Float = Long.MaxValue 
val x2: Float = Long.MaxValue - Int.MaxValue 
println (x1 == x2) 

// NO WONDER NOTHING WORKS 

爲什麼這個表達式返回true

+0

這是否編譯? 'x2'後不需要等號嗎? – Carcigenicate

+0

我無法複製此內容。相反,我得到一個語法錯誤。 –

+1

我找到了你提到的幻燈片。您發佈的代碼與幻燈片上的代碼不同。幻燈片上的代碼沒有語法錯誤。 –

回答

10

A Float是一個4字節的浮點值。同時Long是一個8字節的值,並且Int也是一個4字節的值。但是,數字以4字節浮點值存儲的方式意味着它們只有大約8位的精度。因此,無論最少4個有效字節(另外9-10個數字)的值如何,它們都無法存儲Long的4個最重要字節(大約9-10位數字)。

因此,兩個表達式的Float表示是相同的,因爲不同的位低於Float的分辨率。因此這兩個值比較相等。

+3

給+1寫一個答案,避免每個回答只是回答「浮點算術吸!」!我們都想。 – ashawley

3

迴應Mike Allen的回答,但希望提供一些額外的上下文(將這留作評論而不是單獨的答案,但SO的聲望功能不會讓我)。

整數的最大值範圍定義爲0到2^n(如果它是一個無符號整數)或-2 ^(n-1)到2 ^(n-1)(對於有符號整數),其中n是底層實現中的位數(在這種情況下n = 32)。如果你想用一個有符號值表示一個大於2^31的數字,你不能使用int。一個簽名長的將工作到2^63。對於大於此值的任何事物,有符號浮點數可以上升到大約2^127。

還有一點需要注意的是,這些解決方案問題只有在存儲在浮點數中的值接近最大值時纔有效。在這種情況下,減法運算會導致真實值的變化,即比第一個值小許多個數量級。浮子不會四捨五入100和101之間的區別,但它可能四捨五入10000000000000000000000000000和10000000000000000000000000001.之間

同去的小值的差。如果您將0.1轉換爲整數,您會得到0.這通常不被視爲整數數據類型的失敗。

如果你是對的大小不同的多個數量級的,也不太能容忍舍入誤差,則需要數據結構和解釋二進制數據表示的固有侷限性算法的數字操作。一種可能的解決方案是使用具有較少比特指數的浮點編碼,從而限制最大值,但提供更高分辨率是不太重要的比特。爲了更詳細地檢查出:

相關問題