浮點數在計算機中以二進制科學計數法存儲(IEEE 754),許多十進制小數無法精確表示,導致直接用 == 比較極不可靠。
#include "stdio.h"
main() {
float c, a=0.0039, d=-0.9347, b, f1, f2;
double la, lo;
scanf("%lf", &la);
scanf("%lf", &lo);
if ((fabs(la-65.079) < 0.001) && (fabs(lo-63.9775) < 0.0001)) {
b=28.4; f1=8.7; f2=25.9;
}
c = b + a*f1 + d*f2;
printf("%f", c);
}
fabs 需 <math.h>float 僅 6-7 位有效數字,計算累積誤差大fabs() < epsilon,但變量類型應升級int 並 return 0#include <stdio.h>
#include <math.h>
int main() {
double c, a=0.0039, d=-0.9347, b, f1, f2;
double la, lo;
scanf("%lf", &la);
scanf("%lf", &lo);
// 使用 epsilon 比較,雙精度更安全
const double EPS1 = 0.001;
const double EPS2 = 0.0001;
if (fabs(la - 65.079) < EPS1 && fabs(lo - 63.9775) < EPS2) {
b = 28.4; f1 = 8.7; f2 = 25.9;
} else {
// 明確初始化,避免未定義行為
b = f1 = f2 = 0;
}
c = b + a*f1 + d*f2;
printf("%f\n", c);
return 0;
}
// 通用相等判斷函數
bool float_equal(double a, double b, double epsilon) {
return fabs(a - b) < epsilon;
}
// 相對誤差版本(適合大數值)
bool float_equal_rel(double a, double b, double rel_eps) {
double diff = fabs(a - b);
double max_abs = fmax(fabs(a), fabs(b));
return diff <= rel_eps * max_abs;
}
double,除非記憶體/帶寬極度受限==<math.h> 並鏈接數學庫(-lm)