首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

浮點數與零比較的正確姿勢:利用 IEEE 754 特殊值避免精度陷阱

     編輯:關於C語言

傳統做法的弊端

直接比較 f == 0.0 不可靠,因浮點運算有誤差。常見權宜之計 fabs(f) < 1e-6 魔術常數難維護。

利用特殊值表示「不可比較」

C99 標準庫 <math.h> 提供 INFINITY、NAN 宏,或可自行構造:

static double R_Zero = 0.0;
static double R_PosInf = 1.0 / R_Zero;   // +inf
static double R_NegInf = -1.0 / R_Zero;  // -inf
static double R_Nan    = R_Zero / R_Zero; // nan

比較邏輯重構

double a = 1.0, b = 1.0;
double diff = a - b;

if (diff == R_Nan) {          // 差值為 NaN(如 inf-inf)
    printf("無法判斷相等\n");
} else if (diff == 0.0) {     // 精確為 0
    printf("相等\n");
} else {
    printf("不相等,差值=%g\n", diff);
}

輸出示例

R_Zero   : 0.000000
R_PosInf : inf
R_NegInf : -inf
R_Nan    : -nan
1.000000 - 1.000000 == 0

最佳實踐建議

  • 優先使用 math.h 的 isnan()、isinf()、fpclassify() 分類判斷。
  • 相等性判斷採用「絕對誤差 + 相對誤差」組合:fabs(a-b) <= eps * fmax(1.0, fmax(fabs(a), fabs(b)))。
  • 避免自行構造特殊值,直接包含 <math.h> 使用標準宏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved