温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言浮点数之间的比较规则是什么

发布时间:2021-08-13 19:02:08 来源:亿速云 阅读:248 作者:chen 栏目:开发技术

这篇文章主要介绍“C语言浮点数之间的比较规则是什么”,在日常操作中,相信很多人在C语言浮点数之间的比较规则是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言浮点数之间的比较规则是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录
  • 你认为这段代码输出什么?

  • 为什么不等于呢?

  • 应该怎么解决?

    • 那么怎么判断两个浮点数 f1 和 f2 相等呢。

      • 伪代码

      • 可以简化为 >>

  • 怎么判断浮点数等于0?

    • 还有一个问题


你认为这段代码输出什么?

int main()
{
	float f1 = 1.1;
	float f2 = 2.2;
	if (f2 - 1.1 == f1)
		printf("等于");
	else
		printf("不等于");
	return 0;
}

答案是不等于。

C语言浮点数之间的比较规则是什么

为什么不等于呢?

因为在C语言中浮点数是存在精度损失的,有可能比原来的数大,也有可能小。 在下图所示,f1在打印小数点后30位时就能很明显的看出存在精度损失。

C语言浮点数之间的比较规则是什么

应该怎么解决?

浮点数不能直接用 == 号比较。那么应该怎么比较呢。

这里要引出精度这个概念,精度可以理解为引发一个浮点数发生改变的最小值。

当一个浮点数加上精度或者减去精度,都不等于该数本身。

精度可以是自己定义的,也可以用C语言自带的,它定义在 float.h 头文件中。

#define FLT_EPSILON      1.192092896e-07F        // smallest such that 1.0+FLT_EPSILON != 1.0
#define DBL_EPSILON      2.2204460492503131e-016 // smallest such that 1.0+DBL_EPSILON != 1.0

FLT_EPSILON 为float类型的默认精度,DBL_EPSILON 为double类型的精度。

那么怎么判断两个浮点数 f1 和 f2 相等呢。

虽然两个浮点数存在精度上的误差,但这个误差非常小,只要(f2 - f1)这个差值在负精度到正精度的区间内,就可以认为它们相等。

如图,它们的差值必须在 (-XXX_EPSILON,XXX_EPSILON) 这个区间内,才能说明它们相等。

C语言浮点数之间的比较规则是什么

伪代码
if(f2 - f1) > -XXX_EPSILON  && (f2 - f1)< XXX_EPSION){相等;}
可以简化为 >>
if (fabs(f2 - f1) < XXX_EPSILON) //fabs函数求绝对值,在math.h头文件中{相等;}

怎么判断浮点数等于0?

这个浮点数的绝对值小于精度,可以认为这个数为0。

if (fabs(f1) < XXX_EPSILON)
{
	//f1为0
}

还有一个问题

// 判断f1为0的条件 < 能换成 <= 吗

if (fabs(f1) < XXX_EPSILON) ->>  if (fabs(f1) <= XXX_EPSILON)

0的性质:任何数加上0,都等于它本身。
而上述也讲了精度的定义为浮点数加上XXX_ESILON 都会发生改变,如果 f1 可以等于 XXX_ESILON ,不是说一个浮点数加上0会发生改变吗,这明显不符合0的性质。所以是开区间,只能是 < 。

到此,关于“C语言浮点数之间的比较规则是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI