首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

浮點數運算底層原理:IEEE 754 表示、對階、尾數運算、規格化與硬件實現差異

     編輯:程式設計綜合問答

核心結論

浮點數**不使用補碼**進行減法。現代 CPU 遵循 **IEEE 754** 標準,由專用 **FPU (浮點運算單元)** 執行:

  1. 表示:符號位 (1) + 指數位 (8/11) + 尾數位 (23/52),隱含首位 1。
  2. 加減法流程:
    1. 對階:小指數向大指數對齊,尾數右移。
    2. 尾數加減:符號位參與,實際上用符號幅值或補碼內部表示。
    3. 規格化:左移/右移尾數調整指數,隱含位恢復。
    4. 舍入:最近偶數、向零、向正/負無窮。
    5. 溢出/下溢判斷。
  3. 乘除法:指數加減,尾數乘除,再規格化。

硬件實現差異

  • 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 實現細節不同導致結果微差,不可逐位依賴。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved