== 判断浮点数相等几乎总是错误的,因浮点数是二进制近似表示,0.1+0.2==0.3返回false;应使用epsilon判断绝对或相对误差,接近零时优先用绝对误差。
直接用 == 判断两个 float 或 double 是否相等,几乎总是错的。
为什么 == 不可靠
浮点数在内存中是二进制近似表示,很多十进制小数(如 0.1)无法精确存储。计算过程还会累积舍入误差。即使逻辑上“应该相等”,实际值可能差一个极小量(比如 1e-16)。
常见错误现象:0.1 + 0.2 == 0.3 返回 false;
循环累加 0.1 十次后与 1.0 比较失败;
从文件读入再输出的值,再读回来比较不通过。
用 epsilon 做相对/绝对误差判断
最常用、最可控的方式:检查两数之差的绝对值是否小于某个阈值(epsilon)。但要注意选哪种 epsilon —— 绝对、相对,还是两者结合。
- 对接近零的数,用绝对误差更安全:
abs(a - b) - 对较大数值,相对误差更合理:
abs(a - b) - 工业级写法(兼顾大小值):
abs(a - b) -
eps典型取值:1e-9(float)、1e-15(double),但需根据具体计算误差量级调整
用 std::abs 和 std::numeric_limits 写健壮比较函数
避免手写 magic number,利用标准库获取类型精度信息更可靠: