浮点乘法上的误差边界

Error bound on floating point multiplication

提问人:john 提问时间:8/6/2019 最后编辑:john 更新时间:9/23/2019 访问量:723

问:

我正在寻找一个公式来限制浮点乘法传播的误差。我已经看到了以下陈述(但未得到证实)。

如果是 with bound ulps 的浮点近似值,并且同样是 with bound ulps 的浮点近似值,并且是浮点精度,则正确舍入积上的 bound 为 ulps。xaxuxyayuypxa*yaux + uy + ux*uy/(2^p) + 0.5

我已经看到以下更简单的结果证明。如果近似于与有结合的 ulps,则正确圆角积上的结合是 ulps。yayuyx*yauy + 0.5

所以我想我正在寻找第一个结果的证明,或者至少是确认它是正确的。

TIA系列

编辑

在采纳了马克·迪金森(Mark Dickinson)在下面的评论中所说的话,并重新阅读了弗洛里安·洛伊奇(Florian Loitsch)的论文(来自上面的第二个公式),很明显,这个问题中的ulp是相对于潜在的非规范化结果而言的。例如,使用 Mark 给出的示例,并通过非 IEEE 方法计算乘以尾数并删除较低的 53 位(但必要时四舍五入)的乘积,我们得到

 x   = 0x1.8000000000000p-1
 y   = 0x1.4000000000000p+0
ya   = 0x1.3fffffffffff6p+0
x*y  = 0x0.f000000000000p+0 (denormalised)
x*ya - 0x0.ffffffffffff8p+8 (denormalised)

这是 8 ulp 的误差,并且在第二个公式的范围内。

点精度 IEEE-754

评论

1赞 Mark Dickinson 8/7/2019
这两个结果都不正确:当您从一个比诺的底部移动到下面的比诺的顶部时,两者都忽略了 ulp 误差中产生的 2 倍“摆动”(同时保持相对误差不变)。对于更简单结果的反例,假设 IEEE 754 binary64 格式和语义 , 和 (say )。然后与真实结果相差 15 ulps。(舍入模式无关紧要,因为两种乘法都是精确的。所以我很想看看第二种说法的“证据”。x = 0.75y = 1.25uy = 10ya = 1.25 - 10 * 2**-52x * yax * y
0赞 john 8/7/2019
Florian Loitsch 的论文“Printing Floating-Point Numbers Quickly and Accurate with Integers”(引理 3.4)就是证明。这是一篇众所周知的论文,所以我可能歪曲了它所说的内容。
0赞 john 8/7/2019
@MarkDickinson 当你在保持相对误差不变的情况下说这句话是什么意思?我相信我引用的公式假设误差边界是相对于结果的。因此,在您引用的示例中,15 个 ulps 的误差是针对 or ?yax*ya
0赞 Mark Dickinson 8/7/2019
我的意思是结果(查看 y 的 ulps 是没有意义的,因为可能具有完全不同的量级)。我承认我对那篇论文中发生的事情感到困惑。有这样的陈述:“因为,对于 x⊗y,1 ulp = 2^(q+ex+ey) ......”(在引理 3.3 的证明中)这似乎是不对的,除非对 ULP 有一些非常规的定义 - 给定 x 的 binade 和 y 的 binade 的知识,有两种可能的 binade 可能会落地,因此 的 ulp 有两种可能性。知道我错过了什么吗?15 * ulp(x*ya)x*yax*yx*y
0赞 Mark Dickinson 8/7/2019
啊,我想我明白了,仔细阅读:对于“diy_fp”类型,乘法结果不一定是归一化的,所以我认为在 ulp 的定义中有一些诡计(这不太明确)。因此,事实上,在那篇论文中,“ulp”的使用并不完全符合标准用法(或者更确切地说,与任何标准用法不完全匹配,因为无论如何,对于ulp的确切含义,特别是在基数幂边界附近,并没有普遍的共识)。以下是关于该主题的一些阅读材料。

答:

0赞 vinc17 9/23/2019 #1

如果您假设 ulps 是相对于近似值的(我相信另一种情况更困难,而且无论如何都不太有用),GNU MPFRdoc/algorithms.tex 文档有以下结果的证明,这里重写以遵循您的符号并简化为唯一的精度 p。

如果您有

  • |xa − x|≤用户体验 ·ULP(xa)
  • |ya − y|≤ uy ·ULP(亚)

则四舍五入到最接近的乘积的误差以 [(2 + 21−p)(UX + UY) + 1/2] ·ulp() 中。xa*ya

这通常比您给出的边界大,大约有 2 个因子。但是,您给出的绑定的有效性需要确认。一般来说,找到严格的误差范围是很困难的,因为当 ulp 在 2 的幂下变化 2 倍时,很容易丢失因子 2(摆动),这可能是由于次优证明或极端情况下的准确性实际损失。