为乐趣与收益加上浮点小数
来源: blog.vero.site — 2026-08-30
概述
很多人都知道不该用浮点数算美元和美分,因为十进制数无法被精确表示,0.1 + 0.2 会得到 0.30000000000000004。但作者发现,把 0.01 的倍数两两相加时,很多时候结果完全正确,于是他从 IEEE 双精度的符号位、指数位、尾数位讲起,一步步把那张漂亮的误差图解释清楚。
核心要点
- 双精度浮点数由 1 位符号、11 位指数和 52 位尾数组成,数值为 ±2^E(1+F/2^52),最后一位尾数的有效值就是 ulp(unit in the last place)。
- 把 0.01 的倍数两两相加画成热力图,会出现大片「结果完全正确」的区域,与向上、向下偏差交织成图案。
- 通过分析 0.1 + 0.2 的具体加法过程可以证明:两数之和与精确值的偏差 Δ 只可能是 -ulp(c)、0 或 +ulp(c),也就是最多差一个 ulp。
- 更紧的推导把误差拆成 error(a)+error(b)-error(c)=δ,得到 δ/ulp(c) 落在 [-1, 1],那张离散图因此是更连续版本的取整结果。
- 原本看着玄学的棋盘格,来自把浮点数舍入到偶数尾数时,δ 恰好等于 ±ulp(c)/2 的边界区域。
金句
众所周知,0.1 + 0.2 不等于 0.3,而是 0.30000000000000004。
👍 0
👎 0
← 返回 Lobsters 首页