笔试时曾被问到:如何判断浮点数为0,当时天真无邪,以为用if直接比较,如下所示:
版权归原作者所有,如有侵权,请联系删除。
float a = 2.4;double b = 3.56;if(0 == a){ printf("a为0 \r\n");}if(0 == b){ printf("b为0 \r\n");}
其实不是这样的,回来百度后才知道,float、double分别遵循R32-24,R64-53的标准。他们尾数的位数分别是23、52,即误差在2^-23,2^-52.所以
float
的精度误差在
1e-6
,
double
的精度误差在
1e-15
。
所以,判断两个浮点数是否为0:
要判断一个单精度浮点数是否等于0:if(fabs(f_float) <= 1e-6);
要判断一个双精度浮点数是否等于0:if(fabs(d_double) <= 1e-15);
判断两个浮点数是否相等:
要判断两个单精度浮点数是否相等:if(fabs(f1_float - f2_float) <= 1e-6);
要判断两个双精度浮点数是否相等:if(fabs(d1_double - d2_double) <= 1e-15);
贴上程序:
/** * C语言中判断浮点数是否等于0 * abs() : 返回整型数据的绝对值 * fabs() : 返回浮点型数据的绝对值 */#include #include //因为使用了fabs函数#define FLOAT_EPS 1e-6 //单精度的误差#define DOUBLE_EPS 1e-15 //双精度的误差int main(void){ float f1 = 0.000001; float f2 = 0.001; double d1 = 0.00001; double d2 = 0.00001; //判断浮点数是否等于0 //1、单精度浮点数 if(fabs(f1) <= FLOAT_EPS) //求浮点数的绝对值再与最小值比较 { printf("%f为0\n", f1); } else { printf("%f不为0\n", f1); } //2、双精度浮点数 if(fabs(d1) <= DOUBLE_EPS) { printf("%lf为0\n", d1); } else { printf("%lf不为0\n", d1); } //判断两个浮点数是否相等 //1、单精度浮点数 if (fabs(f1 - f2) <= FLOAT_EPS) { printf("%f 和 %f 相等\n", f1, f2); } else { printf("%f 和 %f 不相等\n", f1, f2); } //2、双精度浮点数 if(fabs(d1 - d2) <= DOUBLE_EPS) { printf("%lf 和 %lf 相等\n", d1, d2); } else { printf("%lf 和 %lf 不相等\n", d1, d2); } return 0;}
引用头文件,是因为使用了fabs(),求浮点数绝对值,
而abs(),
用于求整型的绝对值。
希望下次你面试的时候不再上当。
END
更多内容请关注公众号:嵌入式的路上
改编自:https://blog.csdn.net/xiaotian2516/article/details/93210636
版权归原作者所有,如有侵权,请联系删除。