不能用等号判断两个小数是否相等

极理想情况下,判断两个实数 a 和 b 相等,这里不妨将两个数分别定义为double型,1.0000001 和 1.0 这两个数在绝大多数的情况下,认为它们是相等的,所以经常能看到如下的 C 或者 C++ 代码 if(fabs(a-b)<=eps_0) ,一般地,eps_0设置为很小的数,比如1.0e-6 或者 1.0e-7,直观地来讲,就是说当两个数之间的距离(称为绝对误差)很小很小的时候,我们就认为它们是相等的。

如果数字的数量级很大时,比如下面这两个数10000.0001和10000.000,显然使用上述的距离判断的结果两者不相等,不过,我们来看它们之间的相对误差为(1000.0001-10000.000) /10000.000=1.0e-9,那么这两者也应该认为是相等的,于是使用相对误差的想法,将代码改写为 if(fabs(a-b)<=eps*fabs(a)) 。

使用相对误差可以回避掉数字数量级较大的问题,不过,它对于数量级较小的问题解决起来效果不佳,考虑一种极端情况,比如被比较的两个数字分别为 a=0.0 和 b=0.00000001,这个时候这两个数字相差很小,认为相等,但是使用相对误差的代码时,由于右端项为零,而左端项大于零,显然等式不成立,即使用该方法判断两个数字并不相等。 比较完善的方式是将绝对误差和相对误差结合起来考虑,来设计C++代码:

bool isEqual(const double a, const double b)
{const eps_0 = 1.0e-6, rel_error = 10e-4;bool isEqualFlag = FALSE;if(fabs(a-b)<=eps_0)//绝对误差{isEqualFlag = TRUE;} else{if(fabs(a) >= 1000.0)//相对误差{if(fabs(a-b)<=rel_error*fabs(a)) {isEqualFlag = TRUE;}}}return isEqualFlag;
}

浮点数判等思路总结如下:

  1. 对于数量级较小——绝对误差
  2. 对于数量级较大——相对误差
    可以把苛刻的条件放大,本来fabs(a-b)必须小于10e-6才判定相等,但是因为数据的数量级比较大,所以经过与fabs(a)相乘来将条件放宽,小于10e-4就可以判定相等。

如何判断两个浮点数是否相等:绝对误差 + 相对误差相关推荐

  1. 判断两个浮点数是否相等

    浮点数计算是有误差的: 如 1.2-1.1 计算机中的结果是0.09999999999999987 两个浮点型不能判断相等.如:Double a=1.1; Double b=1.1; System.o ...

  2. 采用C++ 11标准判断两个浮点数是否相等

    在采用C++编写算法时,经常需要判断两个浮点数是否相等.由于计算精度的原因,采用"=="运算符是不可行的.下面给出采用C++11标准判断两个浮点数是否相等的代码: // Test ...

  3. java判断float相等_在java中判断两个浮点型(float)数据是否相等的案例

    示例代码: public static void main(String[] args) { float a = 10.222222225f; float b = 10.222222229f; Sys ...

  4. python判断两个数是否相等_python比较两浮点数是否相等的方法

    python如何比较两个浮点数是否相等? float 类型不能比较相等或不等,但可以比较>,<,>=,<= 用==从语法上说没错,但是本来应该相等的两个浮点数由于计算机内部表示 ...

  5. JavaScript 专题之如何判断两个对象相等

    JavaScript 专题系列第十二篇,讲解如何判断两个参数是否相等 前言 虽然标题写的是如何判断两个对象相等,但本篇我们不仅仅判断两个对象相等,实际上,我们要做到的是如何判断两个参数相等,而这必然会 ...

  6. numpy中两个array数值比较,在IDE中显示完全相同,但是bool判断两个array是否相等却返回False

    numpy踩坑:两个array中数值分别比较,在IDE显示相同,但是bool判断两个array是否相等值却是False 在numpy数据比较时,在IDE显示完全相同但是比较是否相等却有时候返回Fals ...

  7. matlab 判断两个矩阵是否相等

    数学意义的相等 all(A(:) == B(:)) isequal(A, B) 但须注意的是:B = A,未必能保证 isequal(A, B)返回真,因为如果 A 中包含NaN,因为按照定义,NaN ...

  8. c语言测试两个浮点数是否相等,C语言中比较两个浮点数是否相等的方法,fabs和abs...

    今天在面试中碰到这个问题,当时还迷糊了一番,毕竟平时没怎么用过,记得以前看过,现在有点记不清了!这是C语言很基础的东西,面试一般会遇到! 对两个浮点数判断大小和是否相等不能直接用==来判断,会出错!明 ...

  9. 判断两个树是否相等和判断tree1是否包含tree2 python实现

    判断两个树是否相等 def equal(node_a, node_b):"""判断两个树是否相等:param node_a: :param node_b: :return ...

最新文章

  1. vue配置vue-router
  2. Word编写代码时输出半角引号
  3. 两张图看懂GDT、GDTR、LDT、LDTR的关系
  4. oracle11g 隐藏参数_oracle隐含参数的查看与修改
  5. 2. html表单提交servlet出现的乱码问题的解决?
  6. 删除linux内核多余架构,删除多余Linux内核方法
  7. redis lru和lfu的实现
  8. (21)Xilinx FPGA开发软件(FPGA不积跬步101)
  9. java后台导出excel代码详细讲解,java基础面试笔试题
  10. 理解 position:relative 与 position:absolute
  11. 阿里总裁马云对于第5个经济体技术有着独特的见解
  12. Tab栏切换效果的制作
  13. 影响科学圈的那些计算机代码
  14. PCB测试流程分析介绍
  15. 入职中国人寿是个坑?
  16. Unity RenderTexture实现 刮彩票、橡皮擦、擦除效果(3D物体)
  17. 《github精选系列》——非常有趣实用的python爬虫例子
  18. 在linux基础上开发内核,科学院在Linux内核基础上,开发出中文操作系统是()。A.中科LinuxB.熊猫LinuxC.红旗Linux...
  19. 三态门及其在I2C总线中的应用_普中_89C52单片机
  20. http://www.cnblogs.com/xinxin-csharp/p/6146770.html

热门文章

  1. 项目管理杂谈:工期估算
  2. 亲爱的百度,您带着bug翩翩走来……呃
  3. 4:3与16:9 你了解多少?
  4. 路由器开发相关知识总结 —— 以太网PHY芯片
  5. xcode9 上传app后iTues 构建版本不显示
  6. 蓝桥杯国信长天单片机--独立按键和矩阵键盘模块(七)
  7. 空间分集与空分复用技术
  8. android alarm 的权限,android - Android权限被拒绝-com.android.alarm.permission.SET_ALARM - 堆栈内存溢出...
  9. 西部数据HC570 22TB HDD 技术讲解
  10. Unity3D Shader系列之边缘光RimLight