核心結論
浮點數不使用補碼進行減法運算。現代 CPU 內建 FPU (浮點運算單元),完全按照 IEEE 754 標準 以科學計數法形式(符號位、指數位、尾數位)執行加減乘除。
運算流程簡述
- 對階:將小指數對齊到大指數,尾數右移;
- 尾數運算:定點加減(符號幅值或補碼,視實現);
- 規格化:左移尾數直到最高位為 1,調整指數;
- 捨入:按就近偶數等模式捨入;
- 溢出/下溢判斷。
關鍵特性
- 允許誤差:同一輸入不同 CPU 結果可能不同(指令集、捨入模式、融合乘加 FMA 等),但必須在標準規定的 ULP (Unit in Last Place) 範圍內;
- 歷史教訓:Intel Pentium FDIV Bug(1994)因查表邏輯錯誤導致誤差超標,被迫召回;
- 軟件模擬:無 FPU 的嵌入式 MCU 由編譯器生成軟件浮點庫函數調用。
給程序員的建議
- 不要依賴浮點數精確相等判斷(用 epsilon 比較);
- 財務/精確計算用定點數(如
BigDecimal、整數分);
- 了解編譯器優化選項(
-ffast-math 可能破壞 IEEE 754 語義)。