浮點數二進制表示多為近似值(如 0.1 無法精確表示),直接 == 比較極不可靠。即使輸入相同字面值 3.14159,經 scanf 解析後的二進制位模式可能因編譯器/庫實現差異而不完全一致。
#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 庫。#define FEQ(a,b) (fabsf((a)-(b)) < 1e-6f) 宏統一口徑。