知识卡片
浮点截断误差与加法顺序敏感性
内容
浮点数用符号位、指数域和尾数域表示带小数的值,尾数域长度有限,超出部分会被直接丢弃,这种精度损失称为截断误差。它带来一个反直觉的后果:浮点加法不满足严格的结合律,同一组数字按不同顺序相加可能得到不同结果——先把两个很小的数相加、再加到一个大数上,比直接把小数加到大数上更能保留精度,因为大数会把小数的低位”吃掉”(截断)。发散:这解释了为什么金融、导航等对精度敏感的系统要么避免用浮点数直接表示货币金额(改用整数分为单位),要么在做大规模累加时会特意先排序、先合并小值,这不是代码洁癖,而是在对抗浮点数的物理表示限制。
参考来源
《计算机科学概论》第1章《数据存储》