判断是否相等

因为一个浮点数的存储并不总是精确的,例如在经过大量计算之后可能会将3.14保存为3.1400000000001或者3.1439999999999,这时候如果直接用==来比较这两个数的话会输出错误的结果,false(C++中==只有在两个数字完全相同的情况下才判定为true)。所以需要引入极小数eps来修正,只要不超出这个误差,那么就判定为true

通常定义一个eps为常量1e-8:

const double eps = 1e-8;

对应的定义判定是否相等的操作Equ

#define Equ(a, b) ((fabs((a)-(b))<(eps))

上面这行代码是通过宏定义来定义出一个名为Equ的函数,这个函数会将a和b相减,如果相差的结果的绝对值小于极小值eps,那么就判定为true,否则为false。上面加这么多括号是为了防止宏定义可能带来的错误,不能够省略掉。相对应的,如果需要使用不等于,那么只需要用!Equ(a, b)即可。

使用上述函数的例子:

#include <stdio.h>
#include <math.h> const double eps = 1e-8;
#define Equ(a,b) ((fabs((a) - (b)) < (eps)) int main(){
double db = 1.23;
if(Equ(db, 1.23)){
printf("equal");
}
else{
printf("not equal")
}
return 0;
}

大于

#define More(a,b) (((a) - (b)) > (eps))

小于

#define Less(a,b) (((a)-(b)) < (-eps))

大于等于

#define MoreEqu(a,b) (((a)-(b))>(-eps))

小于等于

#define LessEqu(a,b) (((a)-(b))<(eps))

补充:圆周率

\(\cos{\pi} = -1\), \(\pi = \arccos{-1}\),所以:

const double Pi = acos(-1.0);

与误差相关的补充

另外还有:

  1. 在经过大量计算后可能因为误差的累计,一个变量中存储的0实际上是一个非常小的负数,如果这时候对这个变量进行开根号操作sqrt,那么会报错(asin(x)类似,当存放的x为+1或-1时也会出现类似的情况)。因此需要用eps来保证变量在定义域内;
  2. 一些编译环境下0.00的变量可能在输出时会变成-0.00。这是一个bug,只能将结果放在字符串中然后和-0.00比较,如果对比成功那么将结果加上eps来变回0.00 。

参考

《算法笔记》胡凡著

C++笔记(5)——浮点数的比较的更多相关文章

  1. Python开发笔记之-浮点数传输

    操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 Python 版本 : 2.7.5 思路如下 : 1.将浮点数a通过内存拷贝,赋值给相同字节的整型数据b: 2.将b转换为 ...

  2. #AcWing系列课程Level-2笔记——4. 浮点数二分算法

    浮点数二分算法 编写浮点数二分,记住下面的思路,代码也就游刃有余了! 1.首先找到数组的中间值,mid=(left+right)>>1,区间[left, right]被划分成[left, ...

  3. java之浮点数(笔记)

    1.在计算机中,浮点数并不同等于小数. public static void main(String[] args) { double b1 = 0.1; double b2 = 0.2; doubl ...

  4. iOS开发笔记11:表单键盘遮挡、浮点数价格格式化显示、省市区选择器、View Debugging

    1.表单键盘遮挡 应用场景为一个collectionView上有多个textfield.textView供用户填写信息. 之前输入项较少时,采取的方法比较粗暴,didSelectItemAtIndex ...

  5. [Effective JavaScript 笔记] 第2条:理解JavaScript的浮点数

    JavaScript数值型类型只有数字 js只有一种数值型数据类型,不管是整数还是浮点数,js都把归为数字. typeof 17;   // “number” typeof 98.6; // “num ...

  6. php笔记03:布尔类型,字符串,浮点数

    1.布尔类型 下面情况都是看出false: 布尔类型FALSE自身 整型值为0 浮点型值为0.0 空字符串,以及字符串"0" 不包含任何元素的数组 不包含任何成员变量的对象(仅PH ...

  7. [学习笔记]Javascript采用二进制浮点数和四舍五入的错误

    1.样例 var a = .3 - .2 //0.09999999999999998 var b = .2 - .1 //0.1 a == b //false 出现这样的原因在于 1.Javascri ...

  8. 【CSAPP笔记】3. 浮点数

    回想起刚学C语言时,我对浮点数的印象大概是"能够表示小数"的数据类型.还死记硬背过例如什么"小数用double存,用%f输出"这类的话.实际上呢,浮点数可以用这 ...

  9. python课程设计笔记(四)整数、浮点数与字符串 time库

    整数类型(范围无限制) 十进制1 -1 二进制0b1 -0b1 八进制0o1 -0o1 十六进制0x1 -0x1 浮点类型(范围有限制但可忽略) 运算存在不确定尾数 :0.1+0.2!=0.3 原因: ...

随机推荐

  1. 洛谷 P2704 [NOI2001]炮兵阵地 (状态压缩DP+优化)

    题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...

  2. Codeforces 932 数组环构造 树上LCA倍增

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...

  3. php 强制类型转换

      123 123.01 array("123",123) true false null (string)  "123" "123.01" ...

  4. 带加载进度的Web图片懒加载组件Lazyload

    在Web项目中,大量的图片应用会导致页面加载时间过长,浪费不必要的带宽成本,还会影响用户浏览体验. Lazyload 是一个文件大小仅4kb的图片懒加载组件(不依赖其它第三方库),组件会根据用户当前浏 ...

  5. [CF434D Div1] Tree

    问题描述 给定一颗 n 个点的树,树边带权,试求一个排列 P,使下式的值最大 \[ \sum_{i=1}^{n-1}maxflow(P_i,P_{i+1}) \] 其中 maxflow(s, t) 表 ...

  6. git初步研究2

    $git init Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令. 在执行完成 ...

  7. Linux内核设计与实现 总结笔记(第十四章)块I/O层

    一.剖析一个块设备 块设备最小的可寻址单元是扇区. 扇区大小一般是2的整数倍,最常见的是512字节. 因为各种软件的用途不同,所以他们都会用到自己的最小逻辑可寻址单元----块.块只能基于文件系统,是 ...

  8. Bellman-ford算法、SPFA算法求解最短路模板

    Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...

  9. 长链剖分优化树形DP总结

    长链剖分 规定若\(x\)为叶结点,则\(len[x]=1\). 否则定义\(preferredchild[x]\)(以下简称\(pc[x]\),称\(pc[x]\)为\(x\)的长儿子)为\(x\) ...

  10. 官方文档翻译-Today

    原文链接: Today 最后更新:2017-02-18 译文: 应用的今日视图扩展被称作小部件.小部件为用户提供快速访问重要信息的入口.例如,用户打开今日视图实时查看股票价格或天气情况,查看今天的日程 ...