直接比較 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> 使用標準宏。