章节摘要:本章跟着一条主线走——0.1 这个再普通不过的小数,进入计算机后如何在二进制里变成无限循环、如何带出舍入误差、如何在求和中持续失血、又如何逼出 Kahan 补偿这类"止血"手段。读完本章,你拿到的是全书的物证学基础:后文每一章分析误差,都要回来引用这里的语言。
想象数学系和计算机系各写一份 0.1 的档案。数学系写:0.1 是十进制有限小数,精确、干净。计算机系翻档案时发现,二进制世界里 0.1 等于 0.0001100110011…无限循环——就像十进制写不下 1/3 一样,二进制写不下 1/10。从这一刻起,"精确"就退场了,机器里存的永远是一个近似值,约 0.1000000000000000055511151231257827。
这 5.5e-17 的偏差看起来无害,但它是本教程所有案件的第一块物证。爱国者导弹的计时误差、0.1 + 0.2 != 0.3 的经典面试题、金融系统里对不上账的分币差,源头都是它。本章要做的,是把这块物证放在放大镜下:它如何产生(表示误差)、如何进入运算并放大(舍入与抵消)、以及法医学上怎么补救(补偿求和、扩展精度)。
本章关键的认知转折在于:误差不是 bug,而是浮点世界的物理法则。初学者总想把误差"修掉",而有经验的数值计算者做的是三件事——估计它的大小、追踪它的传播路径、在它要爆炸的位置重排运算。0.36 秒的导弹偏差不是程序员哪一行写错了,而是没有为误差累积做设计的系统必然结局。
struct 或位运算拆出一个 float64 的符号位、指数位、尾数位,并解释每一段的含义顺带一条阅读方法:本章三节各配了一个可以直接运行的实验,建议边读边跑——把 0.1 的位模式拆开、看朴素求和偏出多少、用 Kahan 找回几位。计算数学的直觉一半来自推导,另一半来自亲手制造一次小型事故再看它如何发展。每节的"结案陈词"部分把该节压缩成一两句可背诵的判例,复习时先看那里。
术语表也在这里建立:机器精度、条件数、病态、灾难性抵消、补偿求和——这五个词是后文出现频率最高的名词,第一章用不到两百字各给一个可操作的判据。读完本章的标准自测:给你一段十行的浮点代码,能否指出哪一行最可能丢精度、丢了大约多少位。
第二章把误差语言应用到最频繁的案发地——线性方程组。那里会出现一个贯穿全书的关键证人:条件数。它把本章"误差如何进入运算"的定性分析,升级成"误差最多放大多少倍"的定量判决书。