这个问题提出了许多值得探索的案例。我在下面写了一些材料,但这只是一个起点。
在这个答案中,我使用了以下条件:
- 数字以某种 IEEE-754 二进制浮点格式表示并执行算术运算,使用舍入到最近的偶数。
- 我们有一个数字序列s0, s1, s2,… sn−1,在那种格式中,每个都是 (0, 1]并且其精确的数学和为 1。
(请注意,零被排除在区间之外。零的存在不会影响任何最终的总和,因为添加零不会改变值,因此任何包含零的序列都可以通过删除零来简化为没有它们的序列.)
定义:? 是 1 和下一个更大的可表示值之间的差,也称为最低精度单位 (ULP)。 (请注意,ULP 通常是 1 的最小精度单位,而 ULP(x) 是 x 大小的数字的最小精度单位,即,按浮点指数缩放。)
定义:u是单位四舍五入,是[1, 2)中数字四舍五入可能出现的最大误差。在四舍五入模式中,u 是 ½?。在定向舍入模式中,例如朝向无穷大或朝向零,u 是?。 (目前,我不考虑定向舍入模式。)
按最小位排序是准确的。
定义:数字的后一位是其表示中最低有效1的位置值。例如,如果二进制浮点数为 1.011•2-5,则其后一位为 0.001•2-5 = 2-8支持>.
假设我们使用这个算法对数字求和:
- 令 S 为包含序列中数字的集合。
- 选择S中任意两个元素a和b,其后一位不大于任何其他元素。
- 将 S 中的 a 和 b 替换为 a 和 b 的计算总和。
- 重复直到 S 包含一个元素。
S 中剩余的数正好是 1,没有错误。
证明:
- 如果 S 中的某个元素 a 的尾随位小于 1 且不大于 S 中任何其他元素的尾随位,则一定有其他元素 b 在 S 中具有相同的尾随位。这是必要的,因为所有元素的总和为 1,因此该位置的最少非零位的总和必须为零 - 1 位不能是奇数。
- 两个数之和最多为大数的两倍,因此 a 和 b 之和的前导位最多比领先一点。但是它们的尾一位和为零,所以和的尾位至少高一个位置,所以精确和的宽度最多是更宽的操作数的宽度,所以它是完全可表示的,并且计算的和是准确的。
- 所以算法中的所有算术运算都是精确的,所以最终的和是精确的。
按大小排序
假设数字按升序排列,我们依次相加:S0 = s0, S1 = S0 + s1 sub>, S2 = S1 + s2,… Sn-1 = Sn -2 + sn-1。这里,Si 代表精确的数学和。让 Ti 成为我们通过使用浮点运算执行相同算法得到的值。这是在计算一组数字的总和时减少舍入误差的众所周知的技术。
产生每个 Ti 的加法错误的界限是 uT我。对于这个初步的分析,我将假设 uSi 充分近似 uSi。那么总误差的界限是 uSi 对 i 求和,不包括 i=0(因为将 S0 设置为 s0 没有错误;第一次加法发生在 S1 sub>),我会写 sum(uSi).
这等于 u sum(Si)。而 sum(Si) = S1 + S2 + … Sn−1 = (s0) + (s0 + s1) + (s0 + s1 + s2) + ... = (n-2)•s0 + (n-2)•s em>1 + (n−3)•s2 + 1•sn-1。允许 [0, 1] 中的任何实数值,当 s0 和剩余的 si 都是 1/(n-1)。鉴于我们的要求值在 (0, 1] 中,这是无法实现的,并且浮点格式的约束也可能会阻止它,但它给出的总和比浮点值所能提供的要大,所以它仍然是有效界限(忽略 Ti 与 Si)。
那么 sum(Si) 是 n-1 个数从 1/(n -1) 到 1,所以它们的和是 ½(1/(n-1) + 1) • (n-1),我们的界错误是 u • ½(1/(n-1) + 1) • (n-1) = ½联合国。
因此,在添加一百万个数字时,我们可以预期最大误差约为 250,000 ?。 (同样,我们假设 Si 代表 T i。)典型的错误当然会小得多。
请注意,这只是一个界限的推导。上面未检查的其他考虑因素可能会进一步限制错误。例如,如果使用 IEEE-754 基本 32 位二进制浮点时 n 为 2149,则上述界限为 2147 .然而,问题的约束要求每个 si 正好是 2-149,在这种情况下 T224-1 是 2-125 (尚未发生错误),但随后的每个 由于四舍五入,Ti 也是 2-125(将 2-149 添加到 2-125 得到 2-125 由于精度),所以最终结果为 2-125,即误差为 1-2−125,远小于2147。
任意排序
假设我们无法控制顺序,必须按照给定的顺序添加数字。 (0, 1)中任意两个数相加的最大误差为½u,因此前n-2次相加的总误差为½u(n-2)。最后的加法可能会产生 1,所以它的舍入误差受 u 的限制,不一定是 ½u,所以总误差受 ½u 的限制>(n−2) + u = ½un.
讨论
排序加法与任意排序的界限相同。一个原因是排序加法在 uSi 中以代数方式使用舍入误差 u,而任意排序利用 [½, 1) 中的所有数字的舍入误差最多为 ½u 的事实——它使用区间的底部,而排序的加法通道使用比例。因此,可以改进排序的加法推导。此外,最坏的情况是所有数字都相等,这意味着排序没有任何好处。一般来说,排序会改善错误。
负错误和正错误的行为是不对称的,应该分开考虑。