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

浮點數運算原理:非補碼,專用硬件單元按 IEEE 754 執行

     編輯:程式設計綜合問答

核心結論

浮點數不使用補碼進行減法運算。現代 CPU 內建 FPU (浮點運算單元),完全按照 IEEE 754 標準 以科學計數法形式(符號位、指數位、尾數位)執行加減乘除。

運算流程簡述

  1. 對階:將小指數對齊到大指數,尾數右移;
  2. 尾數運算:定點加減(符號幅值或補碼,視實現);
  3. 規格化:左移尾數直到最高位為 1,調整指數;
  4. 捨入:按就近偶數等模式捨入;
  5. 溢出/下溢判斷。

關鍵特性

  • 允許誤差:同一輸入不同 CPU 結果可能不同(指令集、捨入模式、融合乘加 FMA 等),但必須在標準規定的 ULP (Unit in Last Place) 範圍內;
  • 歷史教訓:Intel Pentium FDIV Bug(1994)因查表邏輯錯誤導致誤差超標,被迫召回;
  • 軟件模擬:無 FPU 的嵌入式 MCU 由編譯器生成軟件浮點庫函數調用。

給程序員的建議

  • 不要依賴浮點數精確相等判斷(用 epsilon 比較);
  • 財務/精確計算用定點數(如 BigDecimal、整數分);
  • 了解編譯器優化選項(-ffast-math 可能破壞 IEEE 754 語義)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved