从图中可以看到,在单次计算时,由于存储限制而被舍弃的精度 z,一定小于计算结果高位全是 0,只有最低位是 1 的数值,我们用大写 Z 记录这个只有最低位是 1 的值,由于被舍弃的精度一定小于 Z,我们可以用 Z 来约束单次计算的误差,即单次计算的误差 z < Z 是恒成立的。
而在最坏的情况下,计算结果的精确位部分就需要 X 位,并且每一次计算所产生的的误差是累积的,不会互相抵消。这种情况下,误差的积累速度是最快的。我们用这种情况下只有最低位是 1 的 Z 来估计所有计算的误差。我们很容易能发现,对于任意一次计算的误差 z,z < Z 是恒成立的。因为如果不成立,那么计算的结果一定出现了比 a 更大的数值,这不符合我们的假设。
现在,单次计算的误差不超过 Z,而我们允许的误差位只有 Y 位,于是,我们可以很容易得出,当
即,计算次数达到了 2 的 Y + 1 次方时,此时,在最坏的情况下,我们的误差需要 Y + 1 位才能表示,这种情况,系统就会面临误差风险。
我们每次计算,都有一个 z 被舍弃掉,随着计算次数增加,z 的累积可能导致误差不可接受。误差补偿的思路就是:每次计算我们尝试把 z 存储起来,并且在下一次计算时,我们把 z 再重新加入计算。这样每次计算都会把上次计算的误差考虑进去,系统中的误差不会随着计算次数累积,最终的误差不会超过 Z,也就是只有最低位取 1 的数值。