判断是否相等

因为一个浮点数的存储并不总是精确的,例如在经过大量计算之后可能会将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. window下lamp环境搭建

    软件: apache_2.2.25.msi php-5.4.30-Win32-VC9-x86.zip mysql-5.6.11-win32.msi下载地址:http://download.csdn.n ...

  2. Mysql 服务器管理程序 mysqladmin

    mysqladmin [oprions] command 选项                                      说明 create db_name               ...

  3. mpg123 - 播放 MPEG 1.0/2.0 Layer-1, -2, -3 音频文件

    语法 mpg123 [ -tscvqy01m24 ][ -b size ][ -k num ][ -n num ][ -f factor ][ -r rate ][ -g gain ][ -a dev ...

  4. VB.net删除节点,数据库,文件

    Private Sub mnuDel_Click()'删除节点Dim sKey As String'Dim sFile As StringDim oFS As FileSystemObjectDim ...

  5. Nginx cpu亲和性调整

    意义 Nginx默认没有开启利用多核cpu,我们可以通过worker_processes指令来启动多个worker,但是worker最终运行在哪些cpu核上是系统层进行调度的:我们可以通过增加work ...

  6. 牛客练习赛33 E tokitsukaze and Similar String (字符串哈希hash)

    链接:https://ac.nowcoder.com/acm/contest/308/E 来源:牛客网 tokitsukaze and Similar String 时间限制:C/C++ 2秒,其他语 ...

  7. Android相关资源

    各类黑客大会资料 https://infocon.org/cons/ 各类课程.视频 https://github.com/Developer-Y/cs-video-courses#security ...

  8. Centos7没有Ifconfig命令该怎么办?

    centos7没有ifconfig命令该怎么办? linux系统查看ip地址常用命令是[ifconfig],CentOS 7.0最小安装是没有ifconfig命令怎么办?当然可用[ip addr]查看 ...

  9. java: 列出本机java环境

    java: 列出本机java环境 System.getProperties().list(System.out);

  10. A1065

    判断两数相加是否大于第三数,大于输出true,否则输出false(相等也是false) 1 需要注意数字溢出的问题: 2 先判断溢出,因为在a,b都是负数最小值的情况下,相加直接是正数,在c较小的时候 ...