2013-07-22 32 views

回答

1

從0到2^52(含)的每個整數都可精確表示,從2^52到2^53只有每個偶數整數(最低有效0位),然後是每個第四個整數,最高可達2^64-2^12。

我們可以用一個比特的代碼一概而論,

取M = 52:

for (i=0; i<(64-m+1); i++) { 
      start = i ? 1ULL << (i+m) : 0; 
      end = ((1ULL << m+1)-1) << i; 
      step = 1ULL << i; 
    } 

生產:

0000000000000000 to 001fffffffffffff step 1 
0020000000000000 to 003ffffffffffffe step 2 
0040000000000000 to 007ffffffffffffc step 4 
0080000000000000 to 00fffffffffffff8 step 8 
0100000000000000 to 01fffffffffffff0 step 16 
0200000000000000 to 03ffffffffffffe0 step 32 
0400000000000000 to 07ffffffffffffc0 step 64 
0800000000000000 to 0fffffffffffff80 step 128 
1000000000000000 to 1fffffffffffff00 step 256 
2000000000000000 to 3ffffffffffffe00 step 512 
4000000000000000 to 7ffffffffffffc00 step 1024 
8000000000000000 to fffffffffffff800 step 2048 

實施例:

分配0x0020000000000000到雙給出9007199254740992.0(IEEE754中的0x0x4340000000000000)

分配0x0020000000000001到雙給出9007199254740992.0(相同值)

分配0x0020000000000002到雙給出9007199254740994.0(0x0x4340000000000001,這是下一個可表示值)

+0

由於指數是偏移量爲1023的偏移量,是不是會移動可表示整數的閾值?像從偶數和奇數切換一樣? – aggsol

+0

指數偏差僅對1.0以上和1.0以下的範圍有所不同,但經過測試後,我發現我的答案已經關閉了一些,所以我已經糾正了它。 – matja

1

雙具有尾數的53位,所以任何具有53個連續有效位的無符號64位整數(即,從前1位到最後1位的長度爲53位或更少)可以無損地轉換爲雙精度。