浮點數 (Floating Point)

Overview Table

主題 核心結論 書頁
小數二進位 (fractional binary) 只能精確表示 x×2y 形式的數;如 0.1 無法精確表示 p.145-148
IEEE 754 編碼 V=(1)s×M×2E,三欄位:s / exp(k bits)/ frac(n bits) p.148
Normalized exp 非全 0 非全 1;E=eBiasM=1+f(implied leading 1) p.149-150
Denormalized exp 全 0;E=1BiasM=f;表示 0 與極接近 0 的數(gradual underflow) p.150-151
Special values exp 全 1:frac = 0 → ±;frac ≠ 0 → NaN p.151
分佈特性 可表示值靠近 0 越密集;bit pattern 當 unsigned 整數比較即為浮點大小順序 p.151-153
Rounding 預設 round-to-even;另有 toward-zero / down / up 三種可求上下界 p.156-158
運算性質 +f*f 可交換 (commutative) 但不可結合 (not associative)、乘法不可分配;具單調性 (monotonicity) p.158-160
C 語言轉型 float=單精度、double=雙精度;float/double→int 一律 round toward zero,溢位得 TMin p.160-161

2.4.1 小數的二進位表示 (Fractional Binary Numbers) (p.145-148)

二進位小數點 (binary point) 左側位元權重為 2i,右側為 2i,是理解浮點數的第一步:

(2.19)b=i=nm2i×bi
權重:  2^m ... 4  2  1  .  1/2  1/4  1/8 ... 1/2^n
位元:  b_m ... b2 b1 b0 .  b-1  b-2  b-3 ...  b-n
                        ^
                   binary point
   左移小數點一位 = 除以 2;右移一位 = 乘以 2
十進位能精確表示的數,二進位不一定能。0.1、0.2 在任何有限二進位小數下都是近似值;這是浮點比較 == 常出錯的根源。

2.4.2 IEEE 浮點表示 (IEEE Floating-Point Representation) (p.148-151)

IEEE Standard 754(1985,源自 Intel 8087 與 William Kahan 的設計)將數編碼為:

V=(1)s×M×2E
Single precision (float, 32 bits):  k = 8, n = 23
 31 30       23 22                    0
+--+-----------+----------------------+
|s |   exp     |        frac          |
+--+-----------+----------------------+

Double precision (double, 64 bits):  k = 11, n = 52
 63 62         52 51                  0
+--+-------------+--------------------+
|s |    exp      |       frac         |
+--+-------------+--------------------+

exp 欄位的值分三種情況(Figure 2.33):

exp 欄位            分類              E             M
--------------    -------------    -----------   ---------
非全0 且 非全1  →  1. Normalized     E = e - Bias   M = 1 + f
全 0           →  2. Denormalized   E = 1 - Bias   M = f
全 1, frac = 0 →  3a. Infinity      +∞ (s=0) / -∞ (s=1)
全 1, frac ≠ 0 →  3b. NaN           "not a number"

Case 1: Normalized(最常見)

Case 2: Denormalized(exp 全 0)

為何 denormalized 的 E 定為 1Bias 而非 Bias?為了補償 denormalized 沒有 implied leading 1,使最大 denormalized 值與最小 normalized 值平滑銜接(如 8-bit 格式中 7/512 → 8/512)。(p.150, 152)

Case 3: Special values(exp 全 1)


2.4.3 範例數值 (Example Numbers) (p.151-155)

以 8-bit 格式(k=4, n=3, Bias=7)為例的關鍵值(Figure 2.35):

描述 Bit pattern E M V
Zero 0 0000 000 −6 0 0
最小正 denormalized 0 0000 001 −6 1/8 1/512
最大 denormalized 0 0000 111 −6 7/8 7/512
最小 normalized 0 0001 000 −6 8/8 8/512 = 1/64
One 0 0111 000 0 1 1.0
最大 normalized 0 1110 111 7 15/8 240
Infinity 0 1111 000
數線分佈(6-bit 格式,Figure 2.34):

 -∞ ←|——|——|——|—|—|—|-|||0|||-|—|—|—|——|——|——|→ +∞
      Normalized       Denorm.      Normalized
          可表示值不均勻分佈:越靠近 0 越密集

一般 k-bit exp / n-bit frac 格式的極值公式(Figure 2.36,務必會推):

Bit pattern 特徵 公式 Single 十進位
+0.0 全 0 0 0.0
最小正 denormalized 僅最低位是 1 V=2n×22k1+2 1.4×1045
最大 denormalized exp 全 0、frac 全 1 V=(12n)×22k1+2 1.2×1038
最小正 normalized exp 最低位 1、其餘 0 V=22k1+2 1.2×1038
1.0 exp = 011...1、frac 全 0 1×20 1.0
最大 normalized exp = 111...10、frac 全 1 V=(22n)×22k11 3.4×1038

整數 → 浮點編碼流程(以 12345 為例,p.155):

12345 = [11000000111001]₂
  │ 正規化:右移 binary point 13 位
  ▼
1.1000000111001₂ × 2¹³
  │ frac:去掉 leading 1,補 0 至 23 bits → 10000001110010000000000
  │ exp :13 + Bias(127) = 140 = [10001100]₂
  │ s = 0
  ▼
[0 10001100 10000001110010000000000] = 0x4640E400

2.4.4 捨入 (Rounding) (p.156-158)

浮點只能近似實數,需系統性找「最接近」的可表示值 x。IEEE 定義四種捨入模式;預設為 round-to-even,其餘三種可求出保證上/下界(xxx+):

Mode $1.40 $1.60 $1.50 $2.50 $−1.50 性質
Round-to-even(預設) $1 $2 $2 $2 $−2 最接近;正中間時取偶數尾數
Round-toward-zero $1 $1 $1 $2 $−1 |x^||x|
Round-down $1 $1 $1 $2 $−2 xx
Round-up $2 $2 $2 $3 $−1 xx+
判斷三步驟:(1) 捨去部分 < 一半 → 直接捨去;(2) > 一半 → 進位;(3) 恰為一半(100...0)→ 使保留部分的 LSB 為 0。

2.4.5 浮點運算 (Floating-Point Operations) (p.158-160)

IEEE 規定運算結果為「先精確計算、再捨入」:對實數運算 ,計算應產生 Round(xy)。此定義獨立於任何硬體實作(實務上 FPU 用技巧避免真的算出精確值,只需精度足以保證正確捨入)。

定義 x+fy=Round(x+y)xfy=Round(x×y):

性質 整數加法 (abelian group) 浮點 +f 浮點 *f
封閉性 ✓(可能得 /NaN) ✓(可能得 /NaN)
交換律 (commutative)
結合律 (associative)
單位元素 0 0 1.0
反元素 (inverse) 大多有;±、NaN 例外
分配律 (distributive) ✓(整數乘對加) ✗(乘不分配於加)
單調性 (monotonicity) ✗(unsigned/two's-complement 皆無) ✓(NaN 除外) ✓(NaN 除外)

不可結合的經典反例(single precision):

單調性公式(a, b, c ≠ NaN):

abx+fax+fbab 且 c0afcbfcab 且 c0afcbfcaNaNafa0
結合律缺失是浮點最重要的失落性質:compiler 不能把 x = a+b+c; y = b+c+d; 改寫成共用 t = b+c,因為可能改變結果 — 所以 compiler 對浮點最佳化非常保守。相對地,整數運算保有結合/交換/分配律,才允許 7*x → (x<<3)-x 這類改寫(見 02-Information-Representation/03-Integer-Arithmetic)。

2.4.6 C 語言中的浮點 (Floating Point in C) (p.160-162)

轉型 (casting) 行為總表(int 為 32 bits):

轉型 溢位? 捨入? 說明
int → float 不會 可能(float 只有 24 bits 精度)
int / float → double 不會 不會 double 範圍與精度皆更大,精確保值
double → float 可能 → ±∞ 可能 範圍與精度都縮小
float / double → int 可能 round toward zero(截斷) 1.999 → 1、−1.999 → −1

2.5 本章總結 (Summary) (p.162-163)


Exam/Test Patterns

情境 / 關鍵字 答案
給 bit pattern 判斷類別 exp 非全 0 非全 1 → normalized;exp 全 0 → denormalized;exp 全 1 且 frac=0 → ±∞;exp 全 1 且 frac≠0 → NaN
求 Bias Bias=2k11(single 127、double 1023)
Normalized 解碼 V=(1)s(1+f)×2eBias
Denormalized 解碼 V=(1)sf×21Bias(注意是 1Bias,且無 leading 1)
最大 normalized 值公式 (22n)×22k11;single ≈ 3.4×1038
最小正 denormalized 2n×22k1+2;single ≈ 1.4×1045
最小無法精確表示的正整數 2n+1+1(single: 16,777,217)
「halfway」如何捨入 round-to-even:使結果 LSB 為 0(偶);只有捨去部分恰為 100...0 才算 halfway
(3.14+1e10)-1e10 == 3.14+(1e10-1e10) ? 否(0.0 vs 3.14)— 浮點加法不可結合
x == (int)(float) x 恆真? 否:float 只有 24 bits 精度,大 int 會被捨入(如 TMax)
x == (int)(double) x 恆真?(32-bit int) 是:double 53 bits 精度足以精確表示所有 32-bit int
d == (double)(float) d 恆真? 否:double → float 損失精度或溢位
f == -(-f)d*d >= 0.0 恆真? 是:取負只翻 sign bit;平方單調 ≥ 0(浮點不像 int 的 x*x 會溢位成負)
(f+d)-f == d 恆真? 否:捨入使結合律失效(如 f=1e20, d=3.14 → 左式 0.0)
(int) +1e10 結果 TMin32 = −2147483648(Intel integer indefinite)
1/+01/-0∞−∞sqrt(-1) +、NaN、NaN
為何 denormalized 用 E=1Bias 使最大 denorm 與最小 norm 平滑銜接(gradual underflow)
浮點可用整數指令排序? 可(非負數 bit pattern 遞增即值遞增);負數呈遞減序需特殊處理
Patriot / Ariane 5 0.1 截斷誤差累積(時鐘偏差)/ double→int16 溢位(轉換未檢查範圍)