x
同一个函数 · 两条计算路径
小量在何处消失
把 √(1+x)−1 拆开计算。每一个中间值都保留 17 位有效数字,核对信息究竟在哪一步丢失。
范围 10⁻¹⁸ ≤ x ≤ 10⁻¹。比较的是浏览器实际存储的同一个输入。
10⁻¹⁸10⁻¹
沿着运算往下走
直接路径有理化路径
0存储输入
x,保留作分子
1加上 1
fl(1+x)
fl(1+x)
2取平方根
sqrt(fl(1+x))
sqrt(fl(1+x))
3路径分开
平方根 − 1 → 直接结果
平方根 + 1 → 分母
4核对结果
直接结果(本步不再运算)
x / 分母 → 有理化结果
直接相减
相对于高精度参考的误差
保留分子 x
相对于高精度参考的误差
同一已存储输入的高精度参考(约)
展示前 22 位有效数字;参考在 80 位十进制定点整数中独立求得,误差比较未将有理化浮点结果当成真值。
直接路径有理化路径高精度参考
结果还占 x 的多少?
纵轴为输出 / x,没有单位。正确结果在这里接近 1/2。橙线落到零,表示直接路径已给出 0。
相对误差差了多少?
横轴均为 log₁₀(x),竖线标出当前输入。曲线连接采样点;零误差只画在独立的“0”栏,绝不取对数。
定位丢失小量的那一步
固定 x = 10⁻¹⁶。直接路径得到 0,最早在哪一步完全丢掉了加到 1 上的小量?
这里怎样取得参考值?
输入框先得到一个 binary64 值。实验读取它的二进制字段,将这一已存储值转换成 80 位十进制定点整数,再用整数平方根求 √(1+x),随后以整数运算求有理化表达式。它仍有截断误差,但在当前输入范围内,参考的相对误差小于约 4×10⁻⁶²,远小于图中讨论的双精度舍入。
所有计算路径仍用浏览器实际的 binary64 算术。17 位有效数字用来区分存储值,不等于保证有 17 位准确数字。高精度参考仅用于核对当前输入对应的函数值,不包含原始十进制输入转换为 binary64 的误差。