C++笔记(5)——浮点数的比较
判断是否相等
因为一个浮点数的存储并不总是精确的,例如在经过大量计算之后可能会将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);
与误差相关的补充
另外还有:
- 在经过大量计算后可能因为误差的累计,一个变量中存储的0实际上是一个非常小的负数,如果这时候对这个变量进行开根号操作
sqrt
,那么会报错(asin(x)
类似,当存放的x
为+1或-1时也会出现类似的情况)。因此需要用eps来保证变量在定义域内; - 一些编译环境下0.00的变量可能在输出时会变成-0.00。这是一个bug,只能将结果放在字符串中然后和-0.00比较,如果对比成功那么将结果加上eps来变回0.00 。
参考
《算法笔记》胡凡著
C++笔记(5)——浮点数的比较的更多相关文章
- Python开发笔记之-浮点数传输
操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 Python 版本 : 2.7.5 思路如下 : 1.将浮点数a通过内存拷贝,赋值给相同字节的整型数据b: 2.将b转换为 ...
- #AcWing系列课程Level-2笔记——4. 浮点数二分算法
浮点数二分算法 编写浮点数二分,记住下面的思路,代码也就游刃有余了! 1.首先找到数组的中间值,mid=(left+right)>>1,区间[left, right]被划分成[left, ...
- java之浮点数(笔记)
1.在计算机中,浮点数并不同等于小数. public static void main(String[] args) { double b1 = 0.1; double b2 = 0.2; doubl ...
- iOS开发笔记11:表单键盘遮挡、浮点数价格格式化显示、省市区选择器、View Debugging
1.表单键盘遮挡 应用场景为一个collectionView上有多个textfield.textView供用户填写信息. 之前输入项较少时,采取的方法比较粗暴,didSelectItemAtIndex ...
- [Effective JavaScript 笔记] 第2条:理解JavaScript的浮点数
JavaScript数值型类型只有数字 js只有一种数值型数据类型,不管是整数还是浮点数,js都把归为数字. typeof 17; // “number” typeof 98.6; // “num ...
- php笔记03:布尔类型,字符串,浮点数
1.布尔类型 下面情况都是看出false: 布尔类型FALSE自身 整型值为0 浮点型值为0.0 空字符串,以及字符串"0" 不包含任何元素的数组 不包含任何成员变量的对象(仅PH ...
- [学习笔记]Javascript采用二进制浮点数和四舍五入的错误
1.样例 var a = .3 - .2 //0.09999999999999998 var b = .2 - .1 //0.1 a == b //false 出现这样的原因在于 1.Javascri ...
- 【CSAPP笔记】3. 浮点数
回想起刚学C语言时,我对浮点数的印象大概是"能够表示小数"的数据类型.还死记硬背过例如什么"小数用double存,用%f输出"这类的话.实际上呢,浮点数可以用这 ...
- python课程设计笔记(四)整数、浮点数与字符串 time库
整数类型(范围无限制) 十进制1 -1 二进制0b1 -0b1 八进制0o1 -0o1 十六进制0x1 -0x1 浮点类型(范围有限制但可忽略) 运算存在不确定尾数 :0.1+0.2!=0.3 原因: ...
随机推荐
- Linux系统性能测试工具(二)——内存压力测试工具memtester
本文介绍关于Linux系统(适用于centos/ubuntu等)的内存压力测试工具-memtester.内存性能测试工具包括: 内存带宽测试工具——mbw: 内存压力测试工具——memtester: ...
- 简单的python笔试题
1.输出九九乘法口诀 for i in range(1,10): for j in range(1,i+1): print('{}*{}={}'.format(j,i,i*j),end=' ') pr ...
- Django中使用djangorestframework产生Token
修改settings.py: INSTALLED_APPS添加rest_framework 产生Token from rest_framework.authtoken.models import To ...
- windows下挂载NFS共享目录
1.在打开或关闭Windows功能中,选择安装NFS客户端 2.在命令行中,输入“mount \\172.24.184.31\data x:\”,输入mount查看详细挂载参数(注意此时uid.gid ...
- Insomni'hack teaser 2019 - Reverse - beginner_reverse
参考链接 https://ctftime.org/task/7455 题目描述 A babyrust to become a hardcore reverser 点我下载 解题过程 一道用rust写的 ...
- Git Flow 的正确使用姿势
https://www.jianshu.com/p/41910dc6ef29 Git Flow 的概念 在使用Git的过程中如果没有清晰流程和规划,否则,每个人都提交一堆杂乱无章的commit,项目很 ...
- java File获取字节流
/*文件64位编码*/ public static void main(String[] args) { byte[] fileByte = toByteArray(newFile); String ...
- STM32 JTAG接口SWD下载接线图
- vertica merge 优化
-- 查看RDS的订单数(MySQL) select count(*) from ( SELECT tid, IF(LOCATE('pay_time', jdp_response)=0 ...
- Stree
题目 给出n个点,m条有权边,现对于每一条边,你需要回答出包含这条边的最小生成树的总边权值. 分析 首先我们可以构造一个对于这n个点,m条有权边的最小生成树,显然,这是一棵最小的生成树. 那么这棵生成 ...