C语言丨比较浮点数的大小

由于实数在内存中是以浮点数形式存储的,阶码所占的位数决定实数的表数范围,尾数所占的位数决定实数的精度,ANSI C 并没有明确规定三种浮点类型的阶码和尾数所占的位数,不同的C编译器分配给阶码和尾数的位数是不同的,无论怎样,浮点数在内存中存储时其尾数所占的位数都是有限的,因此其所能表示的实数的精度也是有限的。

听起来很复杂?换句话说就是浮点数并非真正意义上的实数,只是其在某种范围内的近似。

如下列代码中:

float a = 876.4444;
printf("a = %f", a);

运行结果却是:

a = 846.444397

这正是因为float型变量仅能接收实型常量的7位有效数字,在有效数字后面输出的数字都是不准确的。

因此,浮点数大小比较由于精度问题,如果直接比较可能会出错,所以在比较的时候可以设定一个很小的数值(精度),当二者差小于设定的精度时,就认为二者是相等的。


比如:设置精度为1E-2,也就是0.01。对于两个浮点数a、b,如果fabs(a-b)<=1E-2,那么就是相等了;类似的判断大于的时候,就是if ((a>b)&&(fabs(a-b)>1E-2)); 判断小于的时候,就是if ((a<b)&&(fabs(a-b)>1E-2));


当然,精度的设置应有计算过程中需求而定,但要记住的是,只能用近似的方法比较浮点数的大小

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值