为了好玩也为了钱:给浮点数补上十进制小数
来源:blog.vero.site — 45 分 · by Y_Y
📋 概述
作者从一件小事写起:日常用 Python 把收据上的金额加总,其实绝大多数时候并不会出现误差。他于是画出一张图——把所有 0.01 的倍数两两相加到 1.00,标出结果是偏大、偏小还是正确,图案相当漂亮。文章随后从头拆解双精度浮点的构成:1 位符号、11 位指数、52 位小数,以及“隐藏位”带来的 ulp 概念,再用 0.1 + 0.2 一步步走完一次加法的精确语义,包括平局时向偶数舍入的细节。
🔑 核心要点
- 双精度浮点由 1 位符号、11 位指数、52 位小数构成,隐藏位让有效精度变成 53 位。
- 末尾小数位的实际权重是 ulp = 2^(E−52),是衡量误差的基本单位。
- 0.1 + 0.2 的结果恰好与两个最近浮点数等距,于是按向偶数舍入取到 0.30000000000000004。
- 文章用 2Sum、Veltkamp 拆分与 Dekker 乘法这组经典技巧,精确求出加法与乘法的误差项。
- 有了误差项,就能算出 n/100 的精确偏差,用来判断某个求和是否真的可信。
💡 金句
同一条数学公式换一种写法,精度就可能天差地别。
👍 0
👎 0
← 返回 Hacker News 首页