1989 William Kahan —— 浮點數的立法者#
「0.1 + 0.2 ≠ 0.3。這不是 bug,是數學的傷疤。誰替這道 傷疤制定了全球統一的法律?」
案件檔案#
| 項目 | 內容 |
|---|---|
| 得主 | William M. Kahan (1933–) |
| 得獎理由 | 浮點運算標準 IEEE 754 的主要設計者 |
| 關鍵詞 | IEEE 754、捨入、特殊值 |
前因#
1980 年代前,每家電腦的浮點格式不同(IBM、CDC、Cray……), 同一程式在不同機器上答案相異且無法預測誤差行為。 Wilkinson(1970 案)已建立誤差分析理論,但理論需要一個 可分析的底層。Kahan 之問:什麼樣的捨入規則使誤差 可證明、可控制?
線索與推理#
線索一:IEEE 754 的設計原則(1980–85 訂定)#
格式:符號 1 位 + 指數 8 位 + 尾數 23 位(單精度)
值 = (−1)ˢ × 1.fraction × 2^(exponent−127)
關鍵決策:
1. 隱藏首位元 → 多得一位精度
2. 指數偏置 → 無符號比較可直接用整數比較器
3. 捨入到最近偶數 → 長期期望誤差為零(無系統偏誤)
線索二:特殊值系統——失敗也要有語義#
Kahan 堅持納入:
| 值 | 語義 | 反對者當年的理由 |
|---|---|---|
| ±Inf | 溢位繼續有意義 | 「打斷計算就好」 |
| NaN | 0/0 等無意義運算 | 「應觸發中斷」 |
| denormal(次正規數) | 漸進下溢 | 「節省電路」 |
漸進下溢是當年最激烈的戰場:無 denormal 時, a − b(a≈b,皆極小)可能直接跳到 0,毀掉數值穩定性。 Kahan 以 Wilkinson 式論證取勝:下溢的行為必須平滑。
線索三:可再現性與善良公民契約#
754 要求基本運算(+−×÷√)的結果唯一確定(精確結果 再捨入)。這使數值程式可跨機器再現、誤差分析可依賴 「每步至多 ε 的相對誤差」假設——數值分析(1970 案)從 描述性科學變成設計性科學。
理論評析#
機器 ε(單精度約 1.19×10⁻⁷)下的經典傷疤:
0.1 = 0.0001100110011...₂(循環)→ 無法精確表示
0.1 + 0.2 = 0.30000000000000004(雙精度)
Kahan 求和法:補償變數 c 收集每步捨去的殘餘
c += (y − t) (t = s + y 的捨入誤差)
不是消除誤差,而是讓誤差有秩序、可償還——本案哲學。
後果#
- 從手機到超級電腦,一切浮點遵循 754(2008 併入十進制 與 FMA)。
- GPU、深度學習的 bfloat16/FP8 皆為 754 精神的變體 (保留指數寬度、犧牲尾數——Kahan 原則的現代改編)。
關聯案件#
→ 1970-James-Wilkinson與向後誤差分析、1979-Kenneth-Iverson與APL符號程式語言