在一些C/C++语言的基础知识考查中,经常会遇到类似这样一个问题,给定两个浮点数,如何来判断它们是否相等?

今天就跟大家探讨一下这个问题,并通过程序试验结果来分析该问题的正确处理方法。

我们知道,在C语言中可以使用比较操作符(==)来比较两个数字是否相等,比如对于两个整数a和b,可以使用if(a==b)来判断,比如下面这段程序:

整数比较

从程序以及运行结果我们可以清楚的看到,对于整数,比较操作符可以正确的给出比较结果。那么如果a和b变为浮点数,还可以这样使用吗?

让我们通过程序及其运行结果来分析,先看一下a和b相等的情况:

浮点数相等的比较

通过运行结果可以看到当a、b相等时,比较操作符能得到正确的结果。

下面让我们再看一看a、b不相等,但是值很接近的情况,程序及运行结果如下:

浮点数很接近时会给出错误结果

在这个小程序中,因为c=a + b,而a、b又都不为0,所以从数学意义上来说,a和c并不相等,但是程序的运行结果却告诉我们a、b相等。为什么会这样呢?让我们将a、b的值以高精度方式输出,来看看有什么奥秘,请看下面程序及其运行结果:

高精度输出浮点数的值

可见,虽然a和c在数学上不相等,但是它们在计算机中的存储内存却相等,所以导致计算机在比较时做出了相等的结果。

为了进一步说明这个问题,让我们看看数字在计算机中的存储方式。我们知道计算机是以二进制方式来保存数据内容的,整数因为可以精确的转换为一个二进制数,所以可以准确的保存内容,但是小数却不能使用这样的方式。为了在计算机中保存小数,人们发明了浮点数,这种表示法是以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动,类似于数学中的科学计数法。这样,在位数有限的情况下,既扩大了数字的表示范围,又保持了有效精度。

浮点数主要由三部分组成,即符号、阶码与尾数,见下图是32位和64位浮点数的组成:

浮点数的基本组成

浮点数的具体存储格式,以及如何将一个小数转换为二进制浮点数,可参考下面的标准。

  • 二进制浮点数算术标准(IEEE Std 754-1985),也称之为IEC 50599:1989,后来该标准被ISO收录,所以又称之为IOS/IEC/IEEE 60559:2011。
  • 与基数无关的浮点数算术标准(IEEE Std 854-1987)。

更多关于浮点数存储与运算的内容,已经超出了本文讨论的范围,感兴趣者可以参考相关标准的官方文档。

知道了浮点数存在精度的问题,所以上面的程序出现不正确的结果也就不足为奇了,那么回到本文开始时的问题,我们该如何来比较两个浮点数呢?只能使用近似相等,即根据程序的实际情况,定义一个精度值,当两个浮点数之差的绝对值小于该值时,即可认为它们相等,对于不等也可以使用类似的方法。

不过这里又引出一个问题,虽然用户可以定义一个精度值,那么如果为了提高精度,可以让该值无限小吗?显然也不可能,那么最小的精度是多少呢?其实为了方便浮点数的相关运算,标准库提供了一个float.h文件,并定义了一些辅助宏,比如用宏FLT_EPSILON表示单精度浮点数最高精度,以及表示双精度浮点数的宏DBL_EPSILON。

最后,给出一个规范的比较浮点数比较的函数。

浮点数的正确比较方法

由于本人水平有限,文中如果有不足之处,欢迎大家指正。

64位浮点数_C语言常见面试题解析(1)——浮点数的比较相关推荐

  1. C语言一般考点笔试,c语言常见笔试题及答案

    c语言常见笔试题及答案 c语言常见笔试题总结c语言笔试题(九) 2006-09-06 Tag: C语言 1. #include "stdio.h" int main() {int ...

  2. c语言中void f1(),c语言常见笔试题f1ryiedy.doc

    c语言常见笔试题f1ryiedy c语言常见笔试题总结 [1 使用宏] 1.1 #ifdef NDEBUG #define TRACE(S) S #else #define TRACE(S) prin ...

  3. c语言常见错误代码释义,C语言常见错误代码释义解析.doc

    C语言常见错误代码释义解析 C语言常见错误代码释义 错误代码及错误信息 错误释义error 1: Out of memory 内存溢出error 2: Identifier expected 缺标识符 ...

  4. win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法

    win7 64位 VS2010调试提示"ORA-12154: TNS: 无法解析指定的连接标识符"的解决方法 参考文章: (1)win7 64位 VS2010调试提示"O ...

  5. c语言保留小数点后n位_C语言(2)- 定点数和浮点数

    (本文为原创,版权归作者所有) 变量的基本类型里包含了整数和小数,它们是如何由一组0和1来表示的呢? 在数学的世界里,实数可以涵盖一个数轴上所有的点,它应该可以表示我们在日常生活中碰到的大部分的数.实 ...

  6. 32位和64位编译器下的常见类型大小

    写在前面 我们常常听别人说到32位操作系统,64位操作系统,(个人理解)实质上这里所说的32和64指的是地址长度位数. 如果说你是32位的操作系统,那么寻址空间就有2^32,即4G空间大小: 如果说你 ...

  7. c# 多线程 执行事件 并发_C#.NET Thread多线程并发编程学习与常见面试题解析-1、Thread使用与控制基础...

    前言: 因为平时挺少用到多线程的,写游戏时都在用协程,至于协程那是另一个话题了,除了第一次学习多线程时和以前某个小项目有过就挺少有接触了,最近准备面试又怕被问的深入,所以就赶紧补补多线程基础. 网上已 ...

  8. C#.NET Thread多线程并发编程学习与常见面试题解析-1、Thread使用与控制基础

    前言: 因为平时挺少用到多线程的,写游戏时都在用协程,至于协程那是另一个话题了,除了第一次学习多线程时和以前某个小项目有过就挺少有接触了,最近准备面试又怕被问的深入,所以就赶紧补补多线程基础. 网上已 ...

  9. c语言四字节转浮点数_C语言浮点书于字节互相转换

    //字节转为浮点数 float ByteToFloat(unsigned char m[]) { // 求符号位 float sig = 1.; if (m[3] >=128.) sig = - ...

最新文章

  1. java单循环 比较得分_java – 为什么两个单独的循环比一个快?
  2. 链接oracle spatial,oracle spatial初试
  3. 科大星云诗社动态20210217
  4. figma设计_Figma中简单,可重复使用的设计系统
  5. [JDBC] Kettle on MaxCompute 使用指南
  6. Spark数据分析及处理_ELT
  7. metasploit渗透测试指南_Metasploit渗透测试环境搭建与使用
  8. 生成SSH秘钥连接github
  9. 29留数及其应用(五)
  10. [转]NVIDIA/ATI显卡后缀命名大盘点
  11. Linux内存映射——mmap
  12. 一条SQL语句求前面记录的平均值
  13. Linux内核之队列操作
  14. 车辆跟踪设备中晶振分类简介
  15. jquery weui 图片浏览器Photo Browser 如何使用?
  16. 因计算机磁盘硬件的pe,PE缺少AHCI驱动无法识别硬盘更新U盘启动盘中的WINPE
  17. 0004-EMC电磁兼容RE辐射超标整改策略-学习笔记
  18. 山东大学项目实训设计系统(四)管理员端
  19. nginx: [warn] the “user“ directive makes sense only if the master process runs with super-user privi
  20. 微商怎么引流?不懂这些就引不来流量!

热门文章

  1. 基于JAVA+SpringBoot+Mybatis+MYSQL的化妆品售卖系统
  2. 基于JAVA+SpringBoot+Mybatis+MYSQL的医院管理系统
  3. 基于JAVA+SpringMVC+Mybatis+MYSQL的健身管理系统
  4. 计算机四级准考证ppt,计算机等级考试四级课件PPT.ppt
  5. ASP.NET Core学习——5
  6. Linux-网络RAID技术DRBD
  7. 毕业设计一周一记02
  8. Syntax Error: Unexpected token 报错原因
  9. div css左边固定右边自适应布局
  10. WP Super Cache+七牛云配置CDN加速,让你的网站秒开