今天跟大家分享的小技巧是浮点数比较的。我们在之前的文章里已经讲述过整数与浮点数在内存中的存储方式有着本质上的不同。关于float型的变量有效位数是6到7位,准确的说只有6位。下面我们来看一个具体的例子来说明浮点数的有效位数:
#include <stdio.h>
int main(int argc, char *argv[])
{
float a = 23.456;
char b = (char)a;
printf("%d\n",b);
long c = 1688949340;
float d = (float)c;
printf("%ld\t%f\n",c, d);
return 0;
}
运行结果:
23
1688949340 1688949376.000000
我们来分析一下上面的程序,浮点型变量a被赋值为23.456,之后将其强制转化为一个char型变量并赋值给整型变量b,我们看到b的值为23,也就是说当一个float类型的变量被强制转换为一个整数类型变量时,只保留其整数位,而舍弃其小数位(注意是舍弃而不是四舍五入)。
接下来我们再看第二个赋值的程序,一个长整型变量c的初始化值是1688949340,其实际值也是1688949340,没有任何问题。但我们将变量c强制转换为一个浮点类型变量d后,d的实际值并不是1688949340,而是1688949376。我们知道float类型的有效位数只有6到7位,将一个10位数字赋值给float类型变量最后3位将不是有效数字,而可能是非预期的内容。
我们再来看两个浮点数比较的例子:
#include <stdio.h>
int main(int argc, char *argv[])
{
float a = 7.2345602f;
float b = 7.2345600f;
if (a > b)
{
printf("a > b\n");
}
else if (a < b)
{
printf("a < b\n");
}
else
{
printf("a == b\n");
}
return 0;
}
运行结果:
a == b
从程序运行的结果中我们可以看到关于浮点数的比较运算也是只有6到7位有效数字,虽然从直观上讲7.2345602大于7.2345600但对于浮点型变量a和b来说它们的有效值都是7.23456,所以a与b的比较结果是相等的。
有时候我们希望判断一个浮点数变量与另一个浮点数变量的值是否相等,例如:
int main(int argc, char *argv[])
{
float a = 123.45f;
double b = 123.45;
if (a == b)
{
printf("Same\n");
}
else
{
printf("Diff\n");
}
if (fabs(a - b) < 0.00001)
{
printf("Same\n");
}
else
{
printf("Diff\n");
}
printf("%f %lf\n", a, b);
return 0;
}
运行结果:
Diff
Same
123.449997 123.450000
在上面程序中由于直观上a和b的值都是123.45f和12345,但是使用 == 对他们比较的结果并不同,因为实际上a的值是123.449997而b的值是123.450000。所以在对浮点数做相等值判断时需要计算它们差的绝对值是否小于一个阈值,而不是直接判断它们是不是相等。
今天的小技巧你学会了吗?
Copyright © 2015-2023 问渠网 辽ICP备15013245号