← 揭开黑盒:理解系统的调查课堂

第二章 · 计算机选择的数学 / 第五单元 · 机器里的数

多绕一步,能不能算得更准?

有时问题出现在一个很短的式子里:√(x+1) − √x。当 x 很大,两个平方根十分接近。这个差仍然大于零,但机器可能给出零。

预计用时:45 分钟。前置是平方根与乘法分配律。本节完成第五单元“机器里的数”。

让两种解释作出不同预测

在 可视化实验台的公式对照 中,逐步把 x 从 10^4 调到 10^16。先考虑两种解释:结果只是非常小,显示不了;或者中间结果被舍入到相同数,相减后确实得到零。

我们需要一条绕过这个中间步骤的路线,而不是只增加显示的小数位。

给原式乘上一个值为 1 的因子,利用 (a−b)(a+b)=a²−b²,在实数算术中得到:

√(x+1) − √x
= ((x+1) − x) / (√(x+1) + √x)
= 1 / (√(x+1) + √x)

条件是这里的平方根有定义、分母不为零。本课取 x≥0,分母为正。

哪条路径保住了我们关心的信息

在本实验 x=10^16 时,直接相减得到 0,改写式得到 5e-9。这不是说改写后的有限精度值已经等于精确实数答案;它说明我们避免了两个接近的大数相减这一处严重相消。

更细地看,x+1 本身已经无法在 Number 中与 x 区分。直接路线随后产生两个相同平方根;改写路线的分母仍能在这个输入上保持一个良好的量级近似,而分子已经通过代数关系化成精确的常数 1。

代码里确实多了一个除法,式子的形状也更绕。判断它是否更好,需要把准确性纳入目标。如果一个更快的实现直接返回 0,却无法满足任务的误差要求,速度比较已经失去共同前提。

误差要和什么相比

绝对误差描述“差了多少”;相对误差描述“相对于目标量级差了多少”。若真值约为 5e-9,返回 0 的绝对差很小,相对差却约为 100%。对某些用途前者已经可以接受,对另一些用途后者完全不够。

接近零时单独使用相对误差会有困难。常见验收形式是:

|结果 − 参考| ≤ 绝对容差 + 相对容差 × |参考|

容差应由用途、输入和参考的可信度决定。参考如果只是另一段相同精度的程序,也不能自动成为真值。

问题本身与计算过程

有些问题对输入扰动非常敏感:输入只变一点,答案就可能大幅变化。这属于问题的条件。另一些失败来自所选计算过程放大了本可避免的误差。二者需要分别分析。

改写公式可能改善过程,却无法修复传感器本来就不准确的输入。换更高精度可能减少舍入,也不会自动让含糊的任务定义变得明确。这些区别将在本章的误差预算单元继续使用。

第五单元交付

提交一张对照表:取 x=0、10^4、10^8、10^16,记录两条路径的输出,解释差别在哪里开始明显。然后写出这项任务的一个用途,并为它选择验收规则;若无法确定容差,就把缺少的需求写出来。

再回到加法顺序例子,说明两件事分别改变了什么:重新组织运算,重新选择等价表达式。应当能把它们连到具体的舍入节点,而不是只用“精度问题”概括。

我们暂时在能识别表示限制、顺序效应与相消的位置停下。下一单元假设结果已通过检查,追问 乘法之外,机器还在忙什么。