C++ if分支误执行问题:TR[i]等于3却触发小于3的判断
浮点数精度问题排查方案
- 核心问题出在float类型的二进制存储精度限制。单精度浮点数只有24位有效二进制位,没法精确表示所有十进制小数。哪怕你觉得理论上
RA + 0.25f应该等于1.0,但如果RA是通过其他计算得到的、带有微小误差的浮点数(比如实际是0.7499999而不是精确0.75),那相加后结果会略大于1.0,用4减去这个值就会得到一个略小于3.0的数(比如2.9999998),这时TR[i] < 3的条件自然会触发——你看到的输出2.5大概率是打印时的精度截断,实际值并非真的2.5。 - 验证步骤:
- 打印
TR[i]的高精度数值,别只看默认输出的简化结果 - 直接输出
RA + 0.25f的精确值,确认是否等于1.0f
- 打印
- 解决办法:
- 别用浮点数做精确的大小判断,设置一个极小的误差阈值(比如1e-6),改成判断
TR[i] < 3.0f - 1e-6f;如果是要判断是否近似等于3,用fabs(TR[i] - 3.0f) < 1e-6f - 如果业务需要精确计算,要么用定点数类型,要么把数值放大为整数处理(比如所有数乘100转成int运算,避免浮点数误差)
- 别用浮点数做精确的大小判断,设置一个极小的误差阈值(比如1e-6),改成判断
内容的提问来源于stack exchange,提问作者1001Jush
相关产品推荐
相关产品推荐

