2014-11-02 90 views
0

假設有一堆浮點數,那麼它們可以按從小到大排序(即排序)。鍵入雙精度整數和排序順序

如果我把浮點數「轉換」爲像下面這樣的整數,它們會保持相同的順序嗎?我的意思是,從比較實際位的角度來看,它會保存排序順序嗎?

union number { 
    uint64_t i; // [3] 
    double f; 
}; 

我會得到同樣的排序,當我按照if排序時排序的number數組?

在又一也就是說,如果:

x.f < y.f 

它始終認爲:

x.i < y.i 

[1]從我讀,這樣做的實際任期是"type punning"

[2]我不能簡單地「投」(如uint64_t i = (uint64_t)f),因爲這隻會截斷浮點數,對不對?

[3]它是否適用於int64_tuint64_t

+0

關於[3]:它甚至不適用於'int64_t'和'uint64_t'之間的類型雙關。 – mafso 2014-11-02 18:27:57

+3

你究竟在做什麼? – 2014-11-02 18:30:21

+0

@PatriciaShanahan要對整數進行排序,可以比較兩個提示的各個單獨位的對,並且當遇到第一個不相等的對時,較大的數字是具有「1」的數字。我只是想知道是否同樣適用於浮點數...因此,在比較兩個雙精度數據時,我們可以對這個問題進行改寫,一點一點地進行排序,然後就像使用int進行排序一樣。我知道我可以用'<來比較這兩個數字,這只是一個想法... – 2014-11-02 18:44:53

回答

4

換句話說,如果:x.f < y.f它總是認爲:x.i < y.i

不,這不適用於負浮標。例如,-1是0xbff0000000000000,-2是0xc000000000000000。

+0

在具有符號擴展右移運算符的平臺上,是否會正確地對所有非NAN值進行排序?xi ^((xi >> 31)&INT_MAX) – supercat 2014-11-03 22:08:01

+0

@supercat使用unsigned並避免該問題。如果你有效地獲得了一個有符號值,那麼你可以將它轉換爲無符號。 – 2501 2014-11-03 22:09:36

+0

有沒有什麼「好」的方法來產生一個相當於'(x&(INT_MAX + 1U))的值?INT_MAX:0'而不使用算術右移,分支或乘法?在許多處理器上,算術右移將是這些選擇中最便宜的。 – supercat 2014-11-03 22:14:05