上下文:双双算术
“Double-double”是数字表示为两个双精度数字之和,有效数字没有重叠。这种表示利用现有的双精度硬件实现来进行“近四倍精度”计算。
double-double 实现中的一个典型的低级 C 函数可能需要两个双精度数a
,b
并|a| ≥ |b|
计算(s, e)
表示它们和的双精度数:
s = a + b;
e = b - (s - a);
(改编自这篇文章。)
这些实现通常采用舍入到最近的偶数模式。
在上面的计算中,(s, e)
是一个归一化的 double-double 只是因为这个假设。没有它,a == 0x1.0p60
在b == 1
向上舍入模式下,使用 ,s
计算为0x1.0000000000001p60
和e
略高于-0x0.0000000000001p60
。它们的和等于 的数学和,a
但b
它们的有效数字重叠。
Take和一方面 和 另一方面的a == 0x1.0p120
数学和甚至不再重合。a
b
s
e
问题
有没有办法构建一个具有与典型双双库在舍入到最近偶数(即相对快速且相对准确)中具有相同属性的双双类库,但无论舍入如何都有效模式恰好是?
这样的图书馆是否已经存在?
更一般的上下文:正确舍入的基本函数
双双排序的实现用于正确舍入基本函数库的实现中的中间计算。结果,以这种方式实现的库在 FPU 未处于舍入到最近偶数模式时调用函数时往往会失败。出于性能原因以及在函数执行时到达的信号会使 FPU 处于舍入到最近偶数模式,更改函数内部的舍入模式不是很可口。我认为拥有在任何舍入模式下工作的快速、正确舍入的基本函数的最简单方法是,如果可以以某种方式依赖于在任何舍入模式下工作的双双类型算术。