浮點數資料表示 (Floating-Point Data Representation)

重點總覽 (Overview)

IEEE-754 把一個浮點數值拆成三個位元群組,並用一條公式還原成數值。本筆記只聚焦「位元佈局 + 正規化尾數 + 指數超量編碼」三件事;可表示數值、denormalization、NaN/∞、rounding 誤差請見 24-Numerical-Considerations/02-Representable-Numbers-Precision-and-Accuracy

欄位 / 概念 符號 作用 關鍵規則
Sign S 正負號 S=0 正、S=1 負,值乘上 (-1)^S
Exponent E 決定動態範圍 (range) excess/biased 編碼,bias = 2^(e-1) - 1
Mantissa M 決定精度 (precision) 正規化1.M,省略前導 1.,m-bit 等效 (m+1)-bit
通用公式 (A.1) 還原數值 value = (-1)^S × 1.M × 2^(E - bias)
Important

記住分工:E 管範圍 (range)、M 管精度 (precision)、S 管正負號。多一個 E bit → 範圍變大;多一個 M bit → 誤差減半 (精度加倍)。


IEEE-754 位元佈局 (IEEE-754 Bit Layout)

IEEE-754 標準讓所有廠商對浮點資料的「表示」與「運算行為」一致。一個 (S, E, M) 位元組合 (除少數例外) 唯一對應一個數值:

value=(1)S×1.M×2(Ebias)(Eq. A.1)

書中用一個假想 6-bit 格式來示範編碼挑戰:1-bit S + 3-bit E + 2-bit M

 6-bit 教學格式 (1 S, 3 E, 2 M):
 ┌───┬───────────┬───────┐
 │ S │   E (3)   │ M (2) │   bias = 2^(3-1)-1 = 3  (excess-3)
 └───┴───────────┴───────┘
   ↑       ↑          ↑
 正負號  超量編碼    正規化 1.M (省略 "1.")

 真實 IEEE 格式:
 single (32-bit): [ S | E:8  | M:23 ]   bias = 2^7  - 1 = 127
 double (64-bit): [ S | E:11 | M:52 ]   bias = 2^10 - 1 = 1023
格式 S E (bits) M (bits) bias 相對精度
教學 (6-bit) 1 3 2 3
single 1 8 23 127 基準
double 1 11 52 1023 多 29 個 M bits → 最大誤差降為 single 的 1/2^29
Warning

當 E 全為 1 (11…1) 或全為 0 (00…0) 時,(S,E,M) 不再套用 Eq. A.1 — 這些是 NaN/∞/denormalized/0 的保留樣式。本筆記不展開,詳見 24-Numerical-Considerations/02-Representable-Numbers-Precision-and-Accuracy


正規化尾數 (Normalized Representation of M)

Eq. A.1 強制把尾數視為 1.M 形式,目的是讓每個浮點數的位元樣式唯一

0.5D 為例,在 1.M 限制下只有一種寫法:

0.5D=1.0B×21
 同一個 0.5D 的多種寫法,只有 1.M 形式合法:
   1.0B × 2^-1   ✅  符合 1.M (normalized)
   0.1B × 2^0    ❌  不是 1.xx
  10.0B × 2^-2   ❌  不是 1.xx
Tip

「隱含前導 1」是免費的精度。正因如此,IEEE 才需要 denormalized 與保留樣式來處理 1.M 表示不了的 0 與極小數 (見 sibling note 02)。


指數的超量編碼 (Excess / Biased Encoding of E)

E 的位元數決定可表示數值的範圍:大的正 E → 極大值 (E=64 → 介於 2⁶⁴≈10¹⁸ 與 2⁶⁵);大的負 E → 極小分數 (E=−64 → 介於 2⁻⁶⁴≈10⁻¹⁸ 與 2⁻⁶³)。這就是浮點數比整數格式有更廣動態範圍的原因。

IEEE 採用 excess / biased (超量/偏移) 編碼:把 bias = 2^(e-1) - 1 加到指數的 two's complement 表示上,形成 excess 表示。

value=(1)S×1.M×2(E(2(n1)1))(Eq. A.2)

以 3-bit 指數 (e=3) 為例,bias = 2^(3-1) - 1 = 3 (= 011B),稱為 excess-3:

 excess-3 編碼 (3-bit E),依無號值由小到大排序:
  stored code   2's-complement   實際指數值
   000              011             -3
   001              100             -2
   010              101             -1
   011              110              0
   100              111              1
   101              000              2
   110              001              3
   111            (reserved)     ← 全 1 保留樣式
特性 超量編碼 (excess) 直接 two's complement
比較硬體 unsigned comparator 即可 (小、快) 需 signed comparator (大、慢)
單調性 code 隨數值單調遞增 符號位破壞單調順序
範例 001(−2) < 100(1) ✅ 直接比對 需先解讀符號

核心優點:超量編碼後,用無號比較器就能正確比較有號指數 — 因為 bit pattern 隨真實值單調遞增。例如比較 001100,無號上 001 < 100,對應的真值 −2 < 1 也成立。硬體上無號比較器更小更快,是很理想的性質。

完整範例 — 用 6-bit 格式表示 0.5D:

 0.5D = 1.0B × 2^-1
   S = 0           (正)
   E = -1 → excess-3 code = 010
   M = (1.)00 → 存 00
   ⇒  0 | 010 | 00   =  001000B
0.5D=0S010E00M=001000B
Warning

bias 公式用的是 2^(e-1) - 1 (e = 指數位元數),不是 2^e 也不是 2^(e-1)。3-bit → bias 3、8-bit → bias 127、11-bit → bias 1023。算錯 bias 會讓整個指數偏移、數值全錯。


考試/面試重點 (Exam / Test Patterns)

情境 / 關鍵字 答案 / 技巧
「還原浮點數值」 value = (-1)^S × 1.M × 2^(E - bias),bias = 2^(e-1) - 1
「為何尾數是 1.M 不是任意 0.xx」 保證唯一表示 + 隱含前導 1 → m-bit 等效 (m+1)-bit,白賺 1 bit 精度
「single/double 的 E、M 位數」 single: 8/23 (bias 127);double: 11/52 (bias 1023)
「double 比 single 精度高多少」 多 29 個 M bits → 最大表示誤差降為 1/2^29
「為何用 excess 而非 two's complement 存 E」 可用 unsigned comparator 比較有號指數 (單調遞增),硬體更小更快
「3-bit 指數的 bias 是多少」 2^(3-1) - 1 = 3 (excess-3)
「全 1 / 全 0 指數樣式」 保留樣式 (∞/NaN/denorm/0),不套 Eq. A.1 → 屬 note 02
「多一個 M bit vs 多一個 E bit」 M bit → 精度 (誤差減半);E bit → 動態範圍變大
0.5D 的 6-bit 編碼」 001000 (S=0, E=010, M=00)