【浮点数与零值比较】
全网最接地气的C语言关于浮点数与零值比较的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,评论留下各自的见解,相互讨论。希望大家多多给予支持,赠人玫瑰,手有余香!
文章目录
文章目录
float变量与“零值”进行比较
我们已经知道浮点数在内存中的储存方式与整型相差甚远,浮点数在内存中的储存,并不是我们所想的是完整存储的,在十进制转化为二进制,是可能有精度的损失的。注意这里的损失,不是一味的减少了,还有可能增多。
代码示例1:
int main()
{
double x = 3.6;
printf("%.50fn", x);
system("pause");
return 0;
}
根据打印可以看出,并不绝对的等于3.6。
下面我们再看一个代码:
int main()
{
double x = 1.0;
double y = 0.1;
printf("%.50fn", x - 0.9);
printf("%.50fn", y);
if ((x - 0.9) == y)
{
printf("yes!!!!n");
}
else
{
printf("NO!!!!n");
}
system("pause");
return 0;
}
按照我们的常识,我们认为会打印yes!!!!。
但实际上:
结论:因为精度损失的原因,两个浮点数,绝对不能使用==进行相等比较。
那么问题来了,两个浮点数应该怎么比较呢?
结论:应该进行范围精度比较。
//伪代码
if((x - y) > - 精度 && (x - y) < 精度)
{
//TODO;
}
//或者
if(fabs(x - y) < 精度)
{
//TODO;
}
注:fabs是C语言函数库中求绝对值的函数。
精度:我们可以使用宏定义自己设置,也可以使用系统自带的精度。
#include<stdio.h> //使用以下两个精度,需要包含改头文件。
DBL_EPSILON //double最小精度
FLT_EPSILON //float最小精度
代码示例:
#include<float.h>
int main()
{
double x = 1.0;
double y = 0.1;
printf("%.50fn", x - 0.9);
printf("%.50fn", y);
if (fabs((x - 0.9) - y) < DBL_EPSILON)
{
printf("yes!!!!n");
}
else
{
printf("NO!!!!n");
}
system("pause");
return 0;
}
结论:打印yes!!!!
我们转到定义查看DBL_EPSILON可以看出:是一个加上n不等于n的最小的正数。
同样的:
最终代码:
int main()
{
double x = 0.0000000000000000000000001;
//if (fabs(x) < DBL_EPSILON)
if (fabs(x - 0.0) < DBL_EPSILON)
{
printf("YESn");
}
else
{
printf("NOn");
}
system("pause");
return 0;
}
理解:XXX_EPSILON是最小误差,是:XXX_EPSILON + n不等于n的最小的正数。
XXX_EPSILON + n 不等于n的最小的正数,有很多数字 + n 都可以不等于n,但是XXX_EPSILON是其中最小的。
综上:
1,浮点数存储的时候,是有精度的损失的;
2,浮点数是不能进行==比较的;
3,if(fabs(a - b) < DBL_EPSILON);
4,比较时,不能加等号;
OK!!!观众老爷们,这里只是介绍了浮点数与零值的比较,如果朋友们觉得有一点点作用的话,希望朋友们能够给予小菜一点支持!后续继续给朋友们带来更好的博文,还希望朋友们能够继续关注,小菜致力于把自己的学习经验与个人理解更多的分享给大家,望大家喜欢与指正。