【浮点数与零值比较】

81 篇文章 2 订阅
10 篇文章 0 订阅

全网最接地气的C语言关于浮点数与零值比较的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,评论留下各自的见解,相互讨论。希望大家多多给予支持,赠人玫瑰,手有余香!
文章目录

float变量与“零值”进行比较

我们已经知道浮点数在内存中的储存方式与整型相差甚远,浮点数在内存中的储存,并不是我们所想的是完整存储的,在十进制转化为二进制,是可能有精度的损失的。注意这里的损失,不是一味的减少了,还有可能增多。
代码示例1:

int main()
{
	double x = 3.6;
	printf("%.50f\n", x);
	system("pause");
	return 0;
}

在这里插入图片描述
根据打印可以看出,并不绝对的等于3.6。
下面我们再看一个代码:

int main()
{
	double x = 1.0;
	double y = 0.1;
	printf("%.50f\n", x - 0.9);
	printf("%.50f\n", 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("%.50f\n", x - 0.9);
	printf("%.50f\n", 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("YES\n");
	}
	else
	{
		printf("NO\n");
	}
	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!!!观众老爷们,这里只是介绍了浮点数与零值的比较,如果朋友们觉得有一点点作用的话,希望朋友们能够给予小菜一点支持!后续继续给朋友们带来更好的博文,还希望朋友们能够继续关注,小菜致力于把自己的学习经验与个人理解更多的分享给大家,望大家喜欢与指正。

  • 36
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
在C语言中,当我们要比较一个float类型的变量和零时,我们不能使用"=="或"!="来进行比较,因为float类型是不精确的。相反,我们应该使用">="或"<="的形式来进行比较。例如,我们可以使用以下代码来比较一个float变量flag是否等于零: ``` const float NORM = 0.00001; float flag = 0.0; if((flag >= -NORM) && (flag <= NORM)) { printf("flag equal zero.\n", flag); } else { printf("flag not equal zero.\n"); } ``` 在这个例子中,我们定义了一个常量NORM,它表示我们认为与零相等的点数的范围。然后,我们将变量flag初始化为0.0,并使用">="和"<="来判断它是否在NORM的范围内。如果是,则打印"flag equal zero.";如果不是,则打印"flag not equal zero."。这样我们就可以正确地比较一个float变量与零了。123 #### 引用[.reference_title] - *1* [【点数与零比较】](https://blog.csdn.net/qq_43727529/article/details/122298958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* *3* [float变量与零比较 .](https://blog.csdn.net/chenhezhuyan/article/details/19408151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值