IEEE754浮點數以及移碼的設計思想

有夢想的小樹發表於2020-12-27

首先複習一下關於“碼”的知識點:

二進位制整數都是以補碼形式出現的。

  • 正數的補碼與反碼、原碼一致,
  • 負數的補碼是反碼+1.這樣使減法運算可以使用加法器實現,符號位也參與運算;
  • 移碼與補碼就是符號位取反

移碼的設計思想

首先丟擲結果:E = (2^{n-1} -1) + e   (E為階碼,e為真值)。

移碼的幾何意義是把真值對映到一個正數域,其特點是可以直觀地反映兩個真值的大小,即移碼大的真值也大。

基於這個特點,對計算機來說用移碼比較兩個真值的大小非常簡單,只要高位對齊後逐個比較即可,不用考慮負號的問題,這也是階碼會採用移碼錶示的原因所在。

問題:為什麼要階碼真值+127而不是+128呢?

因為8個二進位制位能表示指數的取值範圍為[-128,127],現在將指數變成移碼錶示,即將區間[-128,127]正向平移到正數域,區間裡的每個數都需要加上128,從而得到階碼範圍為[0,255]。

由於計算機規定階碼全為0或全為1兩種情況被當作特殊值處理(全0被認為是機器零,全1被認為是無窮大),去除這兩個特殊值,階碼的取值範圍變成了[1,254]。

如果偏移量不變仍為128的話,則根據換算關係公式[x]階=X+128得到指數的範圍變成[-127,126],指數最大隻能取到126,顯然會縮小浮點數能表示的取值範圍。

所以IEEE754標準規定單精度的階碼偏移量為2^{8-1} -1 (即127),這樣能表示的指數範圍為[-126,127],指數最大值能取到127。
 

接著複習一下尾數的表示:

在IEEE-754標準中,對於一個規格化的32位浮點數,其尾數域所表示的值是1.M,這是因為規格化的浮點數的尾數域最左(最高有效位)總是1,

為了提高尾數的精度,預設尾數的最高有效位是1,故這一位經常不予儲存,而認為隱藏在小數點的左邊,這可以使尾數表示範圍多一位。

 

最後來闡述比較兩個浮點數的過程:

例如:比較兩個浮點數,首先會比較數符,

  • 如果一個浮點數的數符是0,則這個浮點數是正數,另一個浮點數的數符是1,則這個浮點數是負數,可得出比較結果。
  • 如果兩個浮點數的數符都是0即為正數,那麼就需要比較階碼大小,只有移碼與真值的關係是線性關係,才能從高位到低位依次每位數的大小從而確定階碼大小。
  • 如果移碼都相同,在繼續依次比較尾碼。

相關文章