0

0

C++ 怎么判断两个浮点数相等 C++ epsilon精度误差比较方法【精度】

穿越時空

穿越時空

发布时间:2026-02-02 09:39:08

|

185人浏览过

|

来源于php中文网

原创

不能直接用 == 比较两个 float 或 double,因为浮点数以二进制近似存储(如 0.1 + 0.2 ≠ 0.3),导致精度误差;应使用 std::abs(a - b)

c++ 怎么判断两个浮点数相等 c++ epsilon精度误差比较方法【精度】

为什么不能直接用 == 比较两个 floatdouble

因为浮点数在内存中是二进制近似表示,像 0.1 + 0.2 实际存储的值并不是精确的 0.3,而是类似 0.30000000000000004。直接用 == 判断会返回 false,即使数学上相等。

std::abs(a - b) 是最常用方法

核心思路是判断两数之差是否落在可接受的误差范围内。关键在于选对 epsilon 值:

  • 对绝对值较小的数(比如接近 0),用固定小值如 1e-9float)或 1e-15double)通常够用
  • 对较大数值(比如 1e10),固定 epsilon 会失效——此时应改用相对误差:std::abs(a - b) 或更稳妥的 std::abs(a - b)
  • C++20 起可直接用 std::is_close(需 #include ),它内部已处理相对/绝对组合逻辑

std::numeric_limits::epsilon() 不是万能的“默认容差”

std::numeric_limits::epsilon() 返回的是 1.0 和下一个可表示 double 的差值(约 2.22e-16),它只适用于与 1.0 同量级的数。直接拿它当通用 epsilon 用,会导致:

  • 比较 1e8 级别的数时,容差太小,本该相等的数被判为不等
  • 比较接近 0 的数(如 1e-20)时,a * epsilon 可能下溢成 0,退化为纯绝对误差判断,但此时 epsilon() 又太大
  • 它不处理 NaNinf 等特殊值,需额外检查

实际写法建议:优先封装函数,兼顾边界与可读性

别每次手写一堆 std::abs 和三目运算。一个轻量健壮的判断函数长这样:

Petalica Paint
Petalica Paint

用AI为你的画自动上色!

下载

立即学习C++免费学习笔记(深入)”;

bool nearly_equal(double a, double b, double abs_tol = 1e-9, double rel_tol = 1e-12) {
    if (a == b) return true; // 处理完全相等、inf == inf、-0 == +0
    if (std::isnan(a) || std::isnan(b)) return false;
    double diff = std::abs(a - b);
    return diff <= std::max({abs_tol, rel_tol * std::max(std::abs(a), std::abs(b))});
}

调用时按场景传参:nearly_equal(x, y) 默认精度足够日常;涉及科学计算可显式加大 rel_tol;对亚微米级物理量则收紧 abs_tol。真正难的不是写这十几行,而是想清楚你的数据量级和误差来源——这点常被跳过。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

580

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

103

2025.10.23

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

133

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

103

2025.10.23

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

59

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

52

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

25

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

10

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

7

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8.2万人学习

C 教程
C 教程

共75课时 | 4.4万人学习

C++教程
C++教程

共115课时 | 15.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号