【C/C++】浮点数的比较

2023-11-19

本文为 C/C++ 学习总结,讲解浮点数的比较。

浮点数经过大量运算后会损失精度,对比较操作带来较大困扰,因为 C++ 中的 == 操作需要完全相同时才能判定为 true。我们引入一个极小数 eps 修正误差。

比较运算符

若一个数 a 落在 [b-eps, b+eps] 区间中,应当判断相等。经验表明 eps 取 1 0 − 8 10^{-8} 108 合适,不会漏判也不会误判。

const double eps = 1e-8;

为比较方便,可以把操作定义成宏的形式。使用多个括号防止宏定义使用出错:

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

用代码来验证一下:

#include <iostream>
#include <cmath>
using namespace std;
const double eps = 1e-8;
#define Equ(a,b) ((fabs((a)-(b)))<(eps))
int main() {
    double db1 = 4*asin(sqrt(2.0)/2);
    double db2 = 3*asin(sqrt(3.0)/2);
    if(db1==db2) printf("true\n");
    else printf("false\n");
    printf("-----------------------\n");
    if(Equ(db1,db2)) printf("true\n");
    else printf("false\n");
    return 0;
}
/*
false
----------
true
*/

小于运算符应该为 a 小于 b-eps,大于同理;小于等于运算符可以理解为小于和等于,因此将两个区间合并,则 a 小于等于 b+eps,大于等于同理。

圆周率 π \pi π

因为 cos ⁡ ( π ) = − 1 \cos(\pi)=-1 cos(π)=1,则 π = arccos ⁡ ( − 1 ) \pi=\arccos(-1) π=arccos(1)

const double Pi = acos(-1.0);

以上所有核心部分总结如下:

const double eps = 1e-8;
const double Pi = acos(-1.0);
#define Equ(a,b) ((fabs((a)-(b)))<(eps)) // 不等于为:!Equ
#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)) //大于等于

注意:

  1. 在经过大量运算后,0 可能是很小的负数,无法使用 sqrtasin(x) 等函数,这时需要用 eps 保证变量在定义域内
  2. 由于编译环境,0.00 可能会输出 -0.00,将结果放入字符串,与 -0.00 比较,相等则加上 eps 来修正为 0.00
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C/C++】浮点数的比较 的相关文章

随机推荐

  • mysql 批量添加更新_MySql快速插入以及批量更新

    MySql快速插入以及批量更新 插入 MySql提供了可以一次插入多条数据的用法 sql INSERT INTO tbl name a b c VALUES 1 2 3 4 5 6 7 8 9 10 11 12 在程序中可以通过循环 添加V
  • Blender51个基本操作

    一 选择操作 编辑模式 1 右键 选择 2 A 全选 3 B 左键 矩形选择 4 B 中键点击 矩形移除选择 5 C 左键 圆形选择 6 C 中键点击 圆形移除选择 7 滚轮滑动 圆形选择框大小 8 Ctrl 左键 扇形选择 9 Ctrl
  • tcp三次握手和四次挥手的过程以及原因

    简述下TCP三次握手的过程 并解释采用3次握手建立连接的原因 客户端发送连接请求 syn 1 seq x 服务端发送响应请求 syn 1 ack x 1 seq y 表示服务端准备好了 客户端发送确认的请求 ack y 1 seq x 1
  • java.lang.IllegalAccessError: class javax.activation.SecuritySupport12 cannot access its superclass

    最近加入新的项目组 eclipse tomcat7 spring ibatis restful 遇到了这样的问题 说是不能访问父类 我一开始以为是版本的原因 但是久经更改 错误依然 实在累了 最终的解决办法是我把SecuritySuppor
  • uniapp使用uni.createInnerAudioContext()播放指定音频并且切换

    uniapp使用uni createInnerAudioContext播放指定音频并且切换 注意 效果图 主要代码 放上所有的代码 注意 uniapp API 中 uni createInnerAudioContext 是无法多音频播放的
  • 电力行业数字孪生技术应用白皮书(2022)

    白皮书从产学研用多视角出发 结合电力行业的特性 分析阐述了数字孪生概念 核心技术 应用价值以及数字孪生电网标准体系 从数字感知 混合建模 高效仿真 可视化和虚实迭代等不同方面介绍了数字孪生的支撑技术以及应用现状 梳理了当前电力行业数字孪生技
  • C规范编辑笔记(四)

    往期文章 C规范编辑笔记 一 C规范编辑笔记 二 C规范编辑笔记 三 正文 大家好 今天来给大家分享一下C规范编辑笔记第四篇 距离我们C规范编辑笔记第三篇也快过去了一个月 这次继续分享一波 1 以大写形式声明常量 为避免误解 常量值必须根据
  • 信号完整性分析基础知识之传输线和反射(一):阻抗变化引起反射

    阻抗不连续引起的反射和失真可能会导致信号的误触发和误码 这是导致信号失真和质量下降的主要原因 在某些情况下 这看起来像振铃 当信号电平下降时 下冲会影响噪声预算并导致误触发 或者 在下降信号上 峰值可能会上升到低位阈值以上并导致误触发 下图
  • 基于遗传算法(GA)优化高斯过程回归(GA-GPR)的数据回归预测,matlab代码,多变量输入模型。评价指标包括:R2、MAE、MSE、RMSE和MAPE等,代码质量极高,方便学习和替换数据。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 restoredefaultpath 导入数据 P train xlsread data training s
  • pymongo "ServerSelectionTimeoutError: No servers found yet" 错误的解决

    系统转移过程中 擅自把aptitude安装的mongoengine换成了pip安装 系统启动以后 报这个错误 报错提示 File usr local lib python2 7 dist packages pymongo mongo cli
  • 安装黑苹果双系统专辑贴(持续更新...)

    最近终于开始研究黑苹果 然后浏览了几篇文章贴收集一下 以便需要时随时阅览 和同学们互相学习 零基础篇 1 https blog csdn net a792396951 article details 80230946 2 https zhu
  • eNSP实验一(DHCP服务器)

    实验要求 四个电脑自动获取IP Client可以通过域名访问dhcp服务器 实验步骤及结果 第一步 1 打开eNSP软件 新建拓扑 搭建好所有设备 构建一个简单的局域网 第二步 启动所有设备 第三步 规划IP地址 第四步 点击路由器进入配置
  • 空指针异常:trim(),isEmpty()造成

    Trim 对空的再使用会报空指针异常 空字符串是 会创建一个对象 内容是 有内存空间 而null 不会创建对象 没有内存空间 长度为0 这时候再用isEmpty 的会报 空指针异常 尽量使用 null if role getId null
  • 性能测试知多少

    目录 1 性能测试基本理论 1 1 性能测试概念 1 1 1 什么是性能 1 1 2 什么是性能测试 1 2 性能测试基本内容 1 2 1 性能测试 1 2 2 负载测试 1 2 3 压力测试 1 2 4 稳定性测试 1 3 性能测试常用名
  • 二叉树的各种操作函数

    include source h 满与空的问题 计算个数时 判断rear和front的大小1 2 空一个 void InitQueue Queue u u front 0 u rear 0 int sizeQue Queue u int s
  • 测试中常说的持续集成是什么?有什么好处?

    一 持续集成流程 正式接收开发转过来的包之前 先从 svn 上下载代码 给它做次静态代码检查 然后编译打包 可以在开发的服务器或者自己的服务器运行单元测试文件 单元测试后 没用什么大的 bug 再部署到测试环境中 测试环境部署完成后先做冒烟
  • 15 个高级 Java 多线程面试题及回答

    在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分 如果你想获得任何股票投资银行的前台资讯职位 那么你应该准备很多关于多线程的问题 在投资银行业务中多线程和并发是一个非常受欢迎的话题 特别是电子交易发展方面相关的 他们会问面试
  • 【新手基础】-域内域信息搜集

    查看当前权限 Whomai 本地普通用户 win 2008 user 本地管理员用户 win7 x64 test administrator 域内用户 hacker administrator 获取域id sid 域id是唯一id Whoa
  • 数据仓库进阶 《阿里大数据之路》第二篇 数据模型篇 (完整版)

    第8章 大数据领域建模综述 此文章为学习笔记 有兴趣的小伙伴可以根据以下指引获取更多 学习内容链接如下 视频 一起啃书 阿里大数据之路数据仓库建模基础理论研读 已完结 哔哩哔哩 bilibili 书籍 阿里大数据之路 8 1 为什么需要数据
  • 【C/C++】浮点数的比较

    本文为 C C 学习总结 讲解浮点数的比较 浮点数经过大量运算后会损失精度 对比较操作带来较大困扰 因为 C 中的 操作需要完全相同时才能判定为 true 我们引入一个极小数 eps 修正误差 比较运算符 若一个数 a 落在 b eps b