1

上下文:双双算术

“Double-double”是数字表示为两个双精度数字之和,有效数字没有重叠。这种表示利用现有的双精度硬件实现来进行“近四倍精度”计算。

double-double 实现中的一个典型的低级 C 函数可能需要两个双精度数ab|a| ≥ |b|计算(s, e)表示它们和的双精度数:

s = a + b;
e = b - (s - a);

(改编自这篇文章。)

这些实现通常采用舍入到最近的偶数模式。

在上面的计算中,(s, e)是一个归一化的 double-double 只是因为这个假设。没有它,a == 0x1.0p60b == 1向上舍入模式下,使用 ,s计算为0x1.0000000000001p60e略高于-0x0.0000000000001p60。它们的和等于 的数学和,ab它们的有效数字重叠。

Take和一方面 和 另一方面的a == 0x1.0p120数学和甚至不再重合。abse

问题

有没有办法构建一个具有与典型双双库在舍入到最近偶数(即相对快速且相对准确)中具有相同属性的双双类库,但无论舍入如何都有效模式恰好是?

这样的图书馆是否已经存在?

更一般的上下文:正确舍入的基本函数

双双排序的实现用于正确舍入基本函数库的实现中的中间计算。结果,以这种方式实现的库在 FPU 未处于舍入到最近偶数模式时调用函数时往往会失败。出于性能原因以及在函数执行时到达的信号会使 FPU 处于舍入到最近偶数模式,更改函数内部的舍入模式不是很可口。我认为拥有在任何舍入模式下工作的快速、正确舍入的基本函数的最简单方法是,如果可以以某种方式依赖于在任何舍入模式下工作的双双类型算术。

4

1 回答 1

1

njuffa 提到的文章提供了以下功能,其符号与我的问题的符号非常相似,只是在我的问题fl (a+b)中简单地表示了那里的表示a+b

Two−Sum−toward−zero2 (a, b)

if (|a| < |b|)
  swap (a , b)
s = fl (a + b)
d = fl (s − a)
e = fl (b − d)
if(|2 ∗ b|<|d|)
  s = a, e = b
return (s, e)

当处于向零舍入模式时,对于这种特定的基本计算,这是一个非常巧妙的修复。它让人希望有可能实现正确舍入的基本函数,至少通过尽早测试舍入模式并选择单独的算法,或者通过编写适用于所有舍入模式的非常仔细的代码。

于 2013-04-06T19:40:44.623 回答