两双实现弹性的,以FPU舍入模式(double-double implementation resi

2019-08-20 01:17发布

背景:双电双算术

“双双”是一个数字作为两个双精度数的总和的表示而不会在有效数重叠。 这种表示利用现有的双精度硬件实现的用于“近四倍精度”的计算。

在一个两双实现一个典型的低级别的C函数可以采取两个双精度数ab|a| ≥ |b| |a| ≥ |b| 并计算两双数(s, e)表示它们的总和:

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

(摘自这篇文章 。)

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

在上述计算中, (s, e)是归一化两双只有这一假设的,因为。 没有它,与a == 0x1.0p60b == 1 ,在圆向上模式, s被计算为0x1.0000000000001p60e上方的位-0x0.0000000000001p60 。 它们的总和等于的数学和ab ,但其有效数重叠。

就拿a == 0x1.0p120和数学总和ab ,一方面和se ,另一方面甚至不相吻合了。

有没有建立与典型的两双图书馆在相同属性的两双样库的方式舍入到最近的偶数(即,相对快速和相对准确的),但作品无论四舍五入模式恰好是?

难道这样的库已经存在?

更一般的内容:正确舍入的基本功能

两双排序的实施方式被用于以正确的舍入初等函数库执行中间计算。 其结果是,以这种方式实现图书馆往往壮观失败在一个函数被调用,而FPU是不是在舍入到最近的偶数模式 。 改变函数内部的舍入模式不是很适口性好,性能方面的原因,并因为一个信号到达,而函数执行将离开FPU的舍入到最近的偶数模式。 我看到的最简单方法具有快速,正确的舍入,在任何舍入模式下工作会,如果能以某种方式依靠两双实物运算,在任何舍入模式工作的基本功能。

Answer 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)

这是这个特殊的基本计算时以轮对零模式一个非常整洁的修复。 它使一个希望的东西有可能通过早期测试的舍入模式和采摘独立算法实现正确舍入的基本功能,在最起码,或者通过编写所有的舍入模式的工作原理很小心的代码。



文章来源: double-double implementation resilient to FPU rounding mode