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

C 語言浮點數精確比較:採用絕對值誤差範圍判斷相等

     編輯:程式設計綜合問答

問題本質

浮點數二進制表示多為近似值(如 0.1 無法精確表示),直接 == 比較極不可靠。即使輸入相同字面值 3.14159,經 scanf 解析後的二進制位模式可能因編譯器/庫實現差異而不完全一致。

標準解法:Epsilon 比較

#include 
#include 

#define EPSILON 1e-6f  // 根據業務精度調整

int float_equal(float a, float b) {
    return fabsf(a - b) <= EPSILON;
}

// 進階:相對誤差比較(適合大數值)
int float_equal_rel(float a, float b) {
    float diff = fabsf(a - b);
    float max_abs = fmaxf(fabsf(a), fabsf(b));
    return diff <= EPSILON * max_abs;
}

常見誤區

  • abs(a-b) 是整數版,浮點需用 fabsf/fabs (C99)。
  • 固定 EPSILON 不適用極大/極小數,需結合相對誤差或 ULP (Units in Last Place) 比較。
  • 貨幣/金融計算**嚴禁用浮點**,改用定點數 (整數存分) 或 decimal 庫。

最佳實踐

  1. 定義 #define FEQ(a,b) (fabsf((a)-(b)) < 1e-6f) 宏統一口徑。
  2. 輸入驗證階段即轉換為整數 (如金額轉分) 存儲運算。
  3. 單元測試覆蓋邊界:0、極小值、極大值、NaN、Infinity。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved