判断是否相等

因为一个浮点数的存储并不总是精确的,例如在经过大量计算之后可能会将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. Python 自定义三方库

    一.注册一个pypi账号 https://pypi.org/ 二.github上创建一个项目 https://github.com/ 三.编写自己的python项目 项目结构(参考):https:// ...

  2. 45. Jump Game II (JAVA)

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  3. Androidstudio中添加jar包

    1.先到网上下载你需要的jar包,下载下来后,将你Androidstudio中的项目切换为project 2.找到app下的libs,将你下载的jar包复制粘贴进去 3.jar包复制进去后,选中你的j ...

  4. Java基础学习(1)

    Java基础知识 Java平台 1995年由Sun公司创建 Java的体系结构 JVM Java Virtue Machine Java代码的执行顺序 JDK Java Development Kit ...

  5. 安装运行redis

    在Linux系统上安装Redis 环境准备 Redis是C语言开发,建议在Linux上运行,本人系统centos-6.5. 安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有g ...

  6. 【学习】022 ActiveMQ

    一.消息中间件概述 1.1消息中间件产生的背景 在客户端与服务器进行通讯时.客户端调用后,必须等待服务对象完成处理返回结果才能继续执行.  客户与服务器对象的生命周期紧密耦合,客户进程和服务对象进程都 ...

  7. [luogu]P3938 斐波那契[数学]

    [luogu]P3938 斐波那契 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚 ...

  8. SQL 批量修改一个字段的值为另一个字段的值

    AND create_time BETWEEN '2016-07-25 14:30:00' AND '2016-07-25 15:20:28'; AND create_time BETWEEN '20 ...

  9. 使用IDEA 创建Maven项目,外加SSM框架

    使用idea 新创建项目 然后 新创建 java .resources 文件夹...... 图上是项目结构 java文件夹下的 文件夹 命名规范 com.nf147(组织名)+ oukele(作者) ...

  10. Java heap size

    今天在性能诊断工作中遇到 Java heap size, 下面是它的相关的概念. 什么是Java heap size ? Java heap size 堆栈大小, 指Java 虚拟机的内存大小.我的理 ...