核心結論
浮點數**不使用補碼**進行減法。現代 CPU 遵循 **IEEE 754** 標準,由專用 **FPU (浮點運算單元)** 執行:
- 表示:符號位 (1) + 指數位 (8/11) + 尾數位 (23/52),隱含首位 1。
- 加減法流程:
- 對階:小指數向大指數對齊,尾數右移。
- 尾數加減:符號位參與,實際上用符號幅值或補碼內部表示。
- 規格化:左移/右移尾數調整指數,隱含位恢復。
- 舍入:最近偶數、向零、向正/負無窮。
- 溢出/下溢判斷。
- 乘除法:指數加減,尾數乘除,再規格化。
硬件實現差異
- x87 (80 位擴展精度) vs SSE/AVX (嚴格 32/64 位) → 同一代碼不同優化級別結果不同。
- FMA (Fused Multiply-Add) 指令減少中間舍入誤差。
- 早期 Pentium FDIV Bug 即硬件實現缺陷。
程序員應知
- 浮點數比較用
abs(a-b) < epsilon。
- 財務計算用定點數/BigDecimal。
strictfp (Java) / #pragma float_control(precise, on) (MSVC) 強制嚴格 IEEE 754。
總結
浮點運算由硬件 FPU 按 IEEE 754 執行,非補碼減法,過程含對階、規格化、舍入,不同 CPU 實現細節不同導致結果微差,不可逐位依賴。