iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
自我挑戰組

冒牌工程師上學去系列 第 13

1-12 四則運算_IEEE754浮點數表示

  • 分享至 

  • xImage
  •  

IEEE754浮點數表示

  • 浮點數正規化步驟

  1. 將數值化為±(1.XXXX)₂ * 2ⁿ
  2. 確認小數點前第一位是1
    • 例子:
    1. 將(1101.1101)₂做正規化
    // 小數點往前移3格,且小數點前第一位是1
    1101.1101 = 1.1011101*2³
    

IEEE754存放方式

  • 用SEM方式存

    以32bit組成來說如下圖
    32bit又稱單精確,64bit為倍精確
    有沒有發現跟前一章節幾乎一模一樣,不同的是正規化時0.xxx改為1.xxx以及超碼表示方式
    https://ithelp.ithome.com.tw/upload/images/20220927/20141684MhIwxW36hI.png
S:符號,表示正負值,0為正,1為負

E:指數,又稱Characteristic value
    * 有兩種作法[1-8](https://ithelp.ithome.com.tw/articles/10297505)
    1. 超碼表式(excess code):這裡會是超127碼 = 2(⁸ᵇⁱᵗ⁻¹)-1
    2. 用二補數表示
    
M:小數,小數點以後的數,又稱Fraction
  • 例子:剛剛題目正規化後的1.1011101*2³用浮點數儲存格式

    // 正數為0(為什麼最左邊數字是1卻是正數? 這裡題目沒有說是用二補數表示這個值,只有說2進位)
    S:0 
    
    // 超碼表示32bit為超127碼
    E:
    1. 超碼表式 : 3+127 = 130 = 10000010
    2. 用二補數表示 : 3 = 00000011
    
    // 小數點以後的數,未滿23個bit後面自動填入0
    M:101110100000...
    

QA 時間

昨天題目:用-(0.00101101)₂用超16碼表示浮點數SEM存放方式
昨天答案:
// 小數點往後移2格
-(0.00101101)₂ = -(0.101101)*2⁻²

// 負數為1
S:1 

// 超碼表示5bit為超16碼
E:
1. 超碼表式 : -2+16 = 14 = 01110
2. 用二補數表示 : -2 = -(00010) = 11110

// 小數點以後的數,未滿10個bit後面自動填入0
M:1011010000

小故事 : 為什麼會有浮點數誤差?

有一些數值在轉二進制的時候無法被精確的進位
像是(1.5)₁₀= (0001.1000)₂
但是(1.3)₁₀= (0001.0100110011001100......)₂無法完整進位一直無限循環下去
由於32bitSEM的M最多只能存23個bit,因此之後從二進位轉回十進位時會有誤差
而就算是用倍精確64bit,M能多存放到52bit,但依舊解決不了無法完整進位的問題

分類會依照第一篇介紹的分類架構來進行
由於是將學習過程記錄下來,如果有任何錯誤歡迎糾正

以下參考連結在學習過程中覺得非常有幫助:
-WIKI
-從 IEEE 754 標準來看為什麼浮點誤差是無法避免的
-台大線上課程


上一篇
1-11 四則運算_傳統浮點數表示
下一篇
1-13 數碼
系列文
冒牌工程師上學去42
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言