IEEE754浮點數以及移碼的設計思想
首先複習一下關於“碼”的知識點:
二進位制整數都是以補碼形式出現的。
- 正數的補碼與反碼、原碼一致,
- 負數的補碼是反碼+1.這樣使減法運算可以使用加法器實現,符號位也參與運算;
-
移碼與補碼就是符號位取反
移碼的設計思想
首先丟擲結果: (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標準規定單精度的階碼偏移量為 (即127),這樣能表示的指數範圍為[-126,127],指數最大值能取到127。
接著複習一下尾數的表示:
在IEEE-754標準中,對於一個規格化的32位浮點數,其尾數域所表示的值是1.M,這是因為規格化的浮點數的尾數域最左(最高有效位)總是1,
為了提高尾數的精度,預設尾數的最高有效位是1,故這一位經常不予儲存,而認為隱藏在小數點的左邊,這可以使尾數表示範圍多一位。
最後來闡述比較兩個浮點數的過程:
例如:比較兩個浮點數,首先會比較數符,
- 如果一個浮點數的數符是0,則這個浮點數是正數,另一個浮點數的數符是1,則這個浮點數是負數,可得出比較結果。
- 如果兩個浮點數的數符都是0即為正數,那麼就需要比較階碼大小,只有移碼與真值的關係是線性關係,才能從高位到低位依次每位數的大小從而確定階碼大小。
- 如果移碼都相同,在繼續依次比較尾碼。
相關文章
- IEEE754浮點數表示法
- IEEE754標準浮點數表示與舍入
- elixir小技巧:把浮點數轉換為 IEEE754 的 binary 形式
- C# float浮點數與二進位制相互轉換(IEEE754)C#
- 補碼、反碼、浮點數
- Java 浮點數精確性探討(IEEE754 / double / float)與 BigDecimal 解決方案JavaDecimal
- 浮點數的理解
- 浮點數
- Mobx 原始碼與設計思想原始碼
- 浮點數的比較
- js精確計算浮點數相加JS
- js中浮點數計算常用方法JS
- Kafka 的設計思想Kafka
- 計算機組成原理--浮點數-原碼補碼錶示範圍計算機
- Java中浮點數的坑Java
- 詳談IEEE浮點數編碼機制
- 浮點數線上轉hex計算工具
- js處理浮點數計算誤差JS
- 浮點數小知識點
- HikariPool原始碼(二)設計思想借鑑原始碼
- 計組之資料運算:9、浮點數的表示
- PostgreSQL 原始碼解讀(196)- 浮點數比較SQL原始碼
- 深入理解浮點數的表示
- 計算機組成原理浮點數加減計算機
- JavaScript浮點數加減乘除精確計算JavaScript
- 撐起移動AI江山的浮點計算,到底是如何工作的?AI
- 浮點數加減法
- 淺談浮點數(一)
- IEEE浮點數表示法
- 轉換成浮點數
- python處理浮點數Python
- 大數相乘(浮點數)實現
- 浮點數在計算機底層的表示及運算計算機
- 原始碼解讀Dubbo分層設計思想原始碼
- RxJava2 原始碼解析及設計思想RxJava原始碼
- 深入理解OkHttp原始碼及設計思想HTTP原始碼
- 深入理解浮點數的運算
- 程式設計中的自頂向下設計思想程式設計