C++ 为什么double类型不能直接判断等于0 两个double类型怎么判断相等

由于浮点数精度问题,C++中的double类型不能直接判断是否等于0。计算机存储浮点数时存在精度限制,导致看似相等的double值可能并不完全相等。实际判断时,通常使用误差范围,如比较两个double差值是否小于某个极小值(如1e-15)。文章还介绍了两种判断两个double类型相等的方法:一种是利用epsilon(浮点数最小表示),另一种是设定特定精度阈值。
摘要由CSDN通过智能技术生成

C++ 为什么double类型不能直接判断等于0

问题原因

精度丢失, 十进制小数部分在转换成2进制的时候经常会出现无限位的二进制小数,计算机存储小数有长度限制,所以会进行截取部分小数进行存储,计算机只能存储大概的值,而不是精确的值
例如:

2.1 分成两部分
// 整数部分
2 / 2 = 1 .... 0
1 / 2 = 0 .... 1
 
// 小数部分
0.1 * 2 = 0.2 .... 0
0.2 * 2 = 0.4 .... 0
0.4 * 2 = 0.8 .... 0
0.8 * 2 = 1.6 .... 1
0.6 * 2 = 1.2 .... 1
0.2 * 2 = 0.4 .... 0
0.4 * 2 = 0.8 .... 0
0.8 * 2 = 1.6 .... 1
0.6 * 2 = 1.2 .... 1
0.2 * 2 = 0.4 .... 0
0.4 * 2 = 0.8 .... 0
0.8 * 2 = 1.6 .... 1
0.6 * 2 = 1.2 .... 1
............ 无限循环了

实际使用时判断方法

判断一个单精度浮点数:则是if( abs(f) <= 1e-6);
要判断一个双精度浮点数:则是if( abs(f) <= 1e-15 );
若小于,为0;若大于,不为0 。

引申问题:两个double类型怎么判断相等?

方法一: 使用epsilon
// EPSILON指的是浮点数可表示的最小值
static inline bool DoubleEqual(double a, double b)
{
     return fabs(a - b) < std::numeric_limits<double>::epsilon();
}

方法二: 根据精度
static inline bool DoubleEqual(double a, double b)
{
     return fabs(a - b) < 0.000001
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值