第一章 浮点世界的误差档案


第一章 浮点世界的误差档案

章节摘要:本章跟着一条主线走——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 的经典面试题、金融系统里对不上账的分币差,源头都是它。本章要做的,是把这块物证放在放大镜下:它如何产生(表示误差)、如何进入运算并放大(舍入与抵消)、以及法医学上怎么补救(补偿求和、扩展精度)。

沿途站点

  • 1.1 浮点数表示与精度陷阱:解剖 IEEE 754 双精度格式,搞清机器精度、上溢下溢、为什么 0.1 加 0.2 不等于 0.3。主线推进到"表示层"。
  • 1.2 舍入误差、抵消与病态问题:误差从静态档案变成动态作案——求和顺序改变结果、相近数相减吞噬有效数字、问题本身病态时再好的算法也无辜担责。主线推进到"运算层"。
  • 1.3 高精度算术与误差补偿:结案手段。Kahan 补偿求和、成对求和、math.fsum 的精确舍入、mpmath 任意精度。主线收束:误差不能消灭,只能被管理。

拐点与结论

本章关键的认知转折在于:误差不是 bug,而是浮点世界的物理法则。初学者总想把误差"修掉",而有经验的数值计算者做的是三件事——估计它的大小、追踪它的传播路径、在它要爆炸的位置重排运算。0.36 秒的导弹偏差不是程序员哪一行写错了,而是没有为误差累积做设计的系统必然结局。

读完你应该

  • 能用 struct 或位运算拆出一个 float64 的符号位、指数位、尾数位,并解释每一段的含义
  • 能计算给定浮点系统的机器精度、能判断一次减法会损失多少有效数字
  • 能复现"大数吃小数"与"灾难性抵消"两个实验,并说出各自的成因差别
  • 能写出 Kahan 补偿求和并用实验验证它比朴素求和的误差小几个数量级
  • 能判断一个问题是"病态"(该怪数据)还是"算法不稳"(该怪方法),并给出对应处置

顺带一条阅读方法:本章三节各配了一个可以直接运行的实验,建议边读边跑——把 0.1 的位模式拆开、看朴素求和偏出多少、用 Kahan 找回几位。计算数学的直觉一半来自推导,另一半来自亲手制造一次小型事故再看它如何发展。每节的"结案陈词"部分把该节压缩成一两句可背诵的判例,复习时先看那里。
术语表也在这里建立:机器精度、条件数、病态、灾难性抵消、补偿求和——这五个词是后文出现频率最高的名词,第一章用不到两百字各给一个可操作的判据。读完本章的标准自测:给你一段十行的浮点代码,能否指出哪一行最可能丢精度、丢了大约多少位。

下一章的接力

第二章把误差语言应用到最频繁的案发地——线性方程组。那里会出现一个贯穿全书的关键证人:条件数。它把本章"误差如何进入运算"的定性分析,升级成"误差最多放大多少倍"的定量判决书。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U