2009-11-23 66 views
1

我在Hadoop中工作,我需要提供一個比較器來將對象排序爲原始網絡順序字節數組。這對我來說很容易處理整數 - 我只是比較每個字節。我也需要爲浮游物做這個。我想,但是我找不到一個參考,Java中使用的浮點數的IEEE 754格式可以通過比較每個字節作爲有符號的8位值來排序。Java浮動可以通過它們的字節表示進行排序嗎?

任何人都可以確認或反駁嗎?

編輯:表示是IEEE 754 32位浮點。實際上我有一個(較大的)字節緩衝區,並且在該緩衝區中有一個偏移量和一個長度。我發現了一些已經存在的實用方法,可以很容易地把它變成一個浮點數,所以我想這個問題是沒有意義的。如果有人知道答案,我仍然很好奇。

回答

3

正彩車具有相同的順序它們的位表示爲二進制補碼整數觀看。消極的花車不。

例如,-2.0f的位表示是0xc0000000,-1.0f是0xbf800000。如果您嘗試對錶示進行比較,則會得到-2.0f> -1.0f,這是不正確的。

還有NaN的(這比較對所有浮點數據無序的,而表示不)的問題,但你可能不關心他們。

0

好,如果在網絡上發送數據時,你應該有當你發送一個int,當你發送一個浮子某種形式的語義表示的。由於它是機器不可知的信息,因此數據類型寬度也應該在某個地方定義或者由規範預定義(即32位或64位浮點數)。所以,你真正應該做的是將你的字節累加到適當的數據類型中,然後使用自然語言數據類型進行比較。

要一個答案壽,我們需要看到您的發送和接收代碼,看看如果通過某種裝飾I/O流的或一些這樣的東西自動裝箱元真準。爲了得到更好的答案,請提供更好的細節。

1

使用Float.toIntBits(浮動)和比較整數。

編輯:這隻適用於正數,包括正無窮大,但不是NaN。對於負數,您必須顛倒順序。積極數字當然大於負數。

+0

如果沒有負值,則可以使用。 – finnw 2011-05-28 16:40:24

3

這幾乎工程:

int bits = Float.floatToIntBits(x); 
bits ^= (bits >> 31) & Integer.MAX_VALUE; 

這裏負彩車具有反轉的位0-30(因爲你要以相反的順序是什麼原始的符號/幅值表示會給你,同時保留符號位。)

注意事項:(最好考慮是否NaN是涉及未定義的結果)

  • NaN是包含在訂貨
  • + 0現在比較大於-0(內置關係運算符考慮他們平等的。)

它適用於所有其他值雖然,包括非正規數和無窮大。

相關問題