当前位置: 首页 > web >正文

C语言加餐--浮点数比较

        在之前就说过浮点数的相等不能直接用==来进行比较,这是为什么呢?这是因为浮点数在内存中存储会有一定误差的原因.但是之前当我们并没有验证,下面我们来验证一下.

浮点数的存储误差

        下面我们通过多位数的输出来验证一下这个存储误差.

int main()
{float f = 0.1;float f1 = 1.0;printf("%.50f\n", f);printf("%.50f\n", f1);printf("%.50f\n", 0.1);printf("%.50f\n", (f1 - 0.9));return 0;
}

        输出结果见下,可以看出后两个的0.1的输出并不相同.这就是存储误差导致的.

        这时候用==去验证二者相等是不可行的,我们也可以验证一下.

int main()
{float f = 0.1;float f1 = 1.0;if ((f1 - 0.9) == 0.1){printf("相等\n");}else{printf("不等\n");}return 0;
}

        输出结果见下: 

浮点数的比较方法

        既然浮点数不能用==直接进行等于比较,那我们改如何进行浮点数之间的比较呢?

        通常有两种方法,一是自己设置一个精度,如果二者之间差距小于这个精度就相等,反之则不等.二是用编译器自带的精度进行比较,如果二者之间差距小于这个自带精度就相等,反之则不等.通常情况下我们使用第二种来进行比较.

        编译器给出了两个最小精度,一个是float的最小精度,FLT_EPSILON;另一个是double的最小精度,DBL_EPSILON.使用上面两个精度要包含相应的头文件<float.h>.那么什么是最小精度呢?最小精度就是使一个数发生改变的最小的数.加上他之前的数就会发生改变.

        前提都了解好了,那么就让我们看下浮点数的比较,我以double类型为例

#include<float.h>
#include<math.h>int main()
{double f = 0.1;double f1 = 1.0;if (fabs((f1 - 0.9) - 0.1)<DBL_EPSILON){printf("相等\n");}else{printf("不等\n");}return 0;
}

        这样输出结果就是相等了. 

浮点数与0的比较

        有了之前的铺垫,与0的比较也可以看作这个数-0是否在最小精度内,也就相当于这个数是否在最小精度内.

#include<float.h>
#include<math.h>int main()
{double f = 0.000000000000000000000000001;if (fabs(f) < DBL_EPSILON){printf("为0\n");}else{printf("不为0\n");}return 0;
}

        看起来是很不错了,但是还有一个小细节我们要说一下,就是fabs(f) < DBL_EPSILON这里是否要带上等于号?

        应该是不需要带等号的因为一个数加上最小精度数字是会发生改变的,而数字加上0是不会发生任何变化的,所以判断为0时不应该包括最小精度.

        以上就是浮点数的比较啦.希望可以使大家有所收获.

http://www.xdnf.cn/news/3038.html

相关文章:

  • 文件基础-----C语言经典题目(10)
  • 前端Vue3 + 后端Spring Boot,前端取消请求后端处理逻辑分析
  • 第35周Zookkeeper+Dubbo Zookkeeper
  • Transformer数学推导——Q32 可学习位置编码的梯度更新公式推导
  • Arkts完成数据请求http以及使用axios第三方库
  • 杭州数据库恢复公司之Dell服务器RAID5阵列两块硬盘损坏报警离线
  • 服务器远程超出最大连接数的解决方案是什么?
  • 如何创建并使用极狐GitLab 项目访问令牌?
  • 基于esp32的小区智能门禁集成系统设计和实现
  • BFS最短路
  • Vue + ECharts 实现多层极坐标环形图
  • 基于STM32、HAL库的ATECC508A安全验证及加密芯片驱动程序设计
  • java练习2
  • langchain 简单与ollama 关联使用
  • Thinkphp开发自适应职业学生证书查询系统职业资格等级会员证书管理网站
  • SMPP协议解析
  • mysql数据库连接数不足导致 Bean 注入失败
  • 4月28号
  • TCP三次握手
  • [TxRxResult] There is no status packet! 及 Incorrect status packet! 问题修复
  • 第一章 应急响应- Linux入侵排查
  • 文件基础-----C语言经典题目(11)
  • 前端vue2修改echarts字体为思源黑体-避免侵权-可以更换为任意字体统一管理
  • Linux 权限管理
  • API文档生成与测试工具推荐
  • 提示词工程实战指南:解锁AI创作的隐藏技巧与实例
  • AI驱动全流程基于PLUS-InVEST模型的生态系统服务多情景智能模拟与土地利用优化、论文写作
  • Python3: 函数式编程特性
  • 基于Spring Boot 电商书城平台系统设计与实现(源码+文档+部署讲解)
  • Day16(贪心算法)——LeetCode45.跳跃游戏II763.划分字母区间