【浮点数与零值比较】

全网最接地气的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!!!观众老爷们,这里只是介绍了浮点数与零值的比较,如果朋友们觉得有一点点作用的话,希望朋友们能够给予小菜一点支持!后续继续给朋友们带来更好的博文,还希望朋友们能够继续关注,小菜致力于把自己的学习经验与个人理解更多的分享给大家,望大家喜欢与指正。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>