同一个函数 · 两条计算路径

小量在何处消失

把 √(1+x)−1 拆开计算。每一个中间值都保留 17 位有效数字,核对信息究竟在哪一步丢失。

范围 10⁻¹⁸ ≤ x ≤ 10⁻¹。比较的是浏览器实际存储的同一个输入。

10⁻¹⁸10⁻¹

沿着运算往下走

直接路径有理化路径
0存储输入

x

x,保留作分子

1加上 1

fl(1+x)

fl(1+x)

2取平方根

sqrt(fl(1+x))

sqrt(fl(1+x))

3路径分开

平方根 − 1 → 直接结果

平方根 + 1 → 分母

4核对结果

直接结果(本步不再运算)

x / 分母 → 有理化结果

直接路径有理化路径高精度参考

结果还占 x 的多少?

纵轴为输出 / x,没有单位。正确结果在这里接近 1/2。橙线落到零,表示直接路径已给出 0。

相对误差差了多少?

横轴均为 log₁₀(x),竖线标出当前输入。曲线连接采样点;零误差只画在独立的“0”栏,绝不取对数。

定位丢失小量的那一步

固定 x = 10⁻¹⁶。直接路径得到 0,最早在哪一步完全丢掉了加到 1 上的小量?

这里怎样取得参考值?

输入框先得到一个 binary64 值。实验读取它的二进制字段,将这一已存储值转换成 80 位十进制定点整数,再用整数平方根求 √(1+x),随后以整数运算求有理化表达式。它仍有截断误差,但在当前输入范围内,参考的相对误差小于约 4×10⁻⁶²,远小于图中讨论的双精度舍入。

所有计算路径仍用浏览器实际的 binary64 算术。17 位有效数字用来区分存储值,不等于保证有 17 位准确数字。高精度参考仅用于核对当前输入对应的函数值,不包含原始十进制输入转换为 binary64 的误差。