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

浮点数比较大小的问题

浮点数比较大小,由于精度问题,所以直接比较有时可能会出错。

 

单精度数7位有效数字。 (float)
双精度数16位有效数字。(double)

 

单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。 双精度的尾数用52位存储,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以双精度的有效位数是16位

单精度浮点数的实际有效精度为24位二进制,这相当于 24*log102≈7.2 位10进制的精度,所以平时我们说“单精度浮点数具有7位精度”。(精度的理解:当从1.000...02变化为1.000...12时,变动范围为 2-23,考虑到因为四舍五入而得到的1倍精度提高,所以单精度浮点数可以反映2-24的数值变化,即24位二进制精度)

单精度数7位有效数字。

双精度数16位有效数字。 
浮点数取值范围: 
负数取值范围为 -3.4028235E+38 到 -1.401298E-45,正数取值范围为 1.401298E-45 到 3.4028235E+38。 
双精度数取值范围: 
负值取值范围-1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。


所以在比较的时候需要用一个很小的数值来进行比较。(二分法的思想)当二者之差小于这个很小的数时,就认为二者是相等的了。这个很小的数,称为精度。
精度由计算过程中需求而定。比如一个常用的精度为1e-6.也就是0.000001.
所以对于两个浮点数a,b,如果要比较大小,那么常常会设置一个精度
如果fabs(a-b)<=1e-6,那么就是相等了。 fabs是求浮点数绝对值的函数。
类似的 判断大于的时候,就是if(a>b && fabs(a-b)>1e-6)。

判断小于的时候,就是if(a<b&&fabs(a-b)>1e-6)。

例如:

#include<cstdio>  
#include<cmath>  
const double esp = 1e-6;  
int main()  
{  
    double a,b;  
    scanf("%lf %lf",&a,&b);  
    if(fabs(a - b) <= esp)  
        printf("ok\n");  
    else  
        printf("no\n");  
    return 0;  
}  

 

 

原文:http://blog.csdn.net/liujian20150808/article/details/50630546

转载于:https://www.cnblogs.com/Ph-one/p/7612032.html

相关文章:

  • 线性代数线性相关特例
  • +2开闭原则
  • (+4)2.2UML建模图
  • 2.1分层数据流
  • +6是不是用例越多越好?为什么说明原因
  • +1阿姆达尔定律
  • +2流水线是怎样提高性能的,会遇到什么问题,解决方法是什么
  • +3软件优化至关重要,软件优化一般有哪些方法?
  • +4 高速缓存
  • +5性能分析定律
  • +6存储结构是怎样提高性能的,它和局部性的关系是什么。
  • +7虚拟内存的作用,通过什么方式提高虚拟内存的性能
  • EFM32JG系列MCU内部温度传感器使用方法
  • 1.1组合电路、时序电路在计算机课程中的地位
  • 4.2说说计算机中的异常
  • 时间复杂度分析经典问题——最大子序列和
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 2017-08-04 前端日报
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Java,console输出实时的转向GUI textbox
  • Magento 1.x 中文订单打印乱码
  • python学习笔记-类对象的信息
  • redis学习笔记(三):列表、集合、有序集合
  • webgl (原生)基础入门指南【一】
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 大快搜索数据爬虫技术实例安装教学篇
  • 批量截取pdf文件
  • 如何解决微信端直接跳WAP端
  • 什么软件可以剪辑音乐?
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #Linux(帮助手册)
  • #QT(串口助手-界面)
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (52)只出现一次的数字III
  • (k8s中)docker netty OOM问题记录
  • (二)linux使用docker容器运行mysql
  • (四)库存超卖案例实战——优化redis分布式锁
  • .Net 路由处理厉害了
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net 使用ajax控件后如何调用前端脚本
  • .Net6 Api Swagger配置
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net实现客户区延伸至至非客户区
  • /etc/motd and /etc/issue
  • [2]十道算法题【Java实现】
  • [AIGC] MySQL存储引擎详解
  • [BUUCTF 2018]Online Tool
  • [C#]DataTable常用操作总结【转】
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [C++]priority_queue的介绍及模拟实现
  • [C++]运行时,如何确保一个对象是只读的
  • [C语言]——分支和循环(4)