知识卡片
误差要建模
内容
判断浮点结果是否“相等”应使用可接受误差,而不是期待二进制近似回到数学精确值。发散:系统边界上的数值类型选择,本质是在性能、范围和确定性之间取舍。
参考来源
- 位置:《Go语言底层原理剖析》第2章《浮点数设计原理与使用方法》2.9节《浮点数计算与精度损失》
- 结论依据:原文用 1000 个 0.01 相加最终结果为 9.999999999999831(而非精确的10)的例子说明浮点数计算会累积精度损失,并给出优化建议"优先执行乘法和除法运算",可推出"浮点数比较应使用容差而非期待运算结果精确回到数学值"的结论。
- 原始内容:可以看出,在浮点数的计算过程中可能产生精度的损失,并且精度的损失可能随着计算的次数而累积。同时浮点数的计算顺序也会对最终的结果产生影响……在下面说明浮点数精度损失的例子中,1000个0.01相加的最终结果为9.999999999999831。加法运算由于需要进行指数调整,有丢失精度的风险,优秀的开发工程师在执行涉及加、减、乘和除的运算时,会优先执行乘法和除法运算。