双双实现,可灵活应对 FPU 舍入模式

double-double implementation resilient to FPU rounding mode

提问人:Pascal Cuoq 提问时间:4/7/2013 最后编辑:phuclvPascal Cuoq 更新时间:9/10/2020 访问量:402

问:

上下文:双双算术

“双精度”是数字的表示形式,表示为两个双精度数的总和,在有效数中没有重叠。这种表示利用现有的双精度硬件实现进行“接近四精度”的计算。

双精度实现中的一个典型低级 C 函数可能采用两个双精度数,并计算表示其总和的双精度数:ab|a| ≥ |b|(s, e)

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

(改编自本文

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

在上面的计算中,才是归一化的双倍,只是因为这个假设。如果没有它,在向上舍入模式下,用 、 计算为 和 稍高一点。它们的总和等于 和 的数学总和,但它们的有效性重叠。(s, e)a == 0x1.0p60b == 1s0x1.0000000000001p60e-0x0.0000000000001p60ab

取和 和 一方面和另一方面的数学总和甚至不再重合。a == 0x1.0p120abse

问题

有没有办法构建一个双双的库,其属性与典型的双双库在四舍五入到最接近偶数(即相对较快和相对准确)中具有的属性相同,但无论舍入模式如何?

这样的库已经存在了吗?

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

double-double 排序的实现用于正确舍入初等函数库的实现中的中间计算。因此,当 FPU 未处于舍入到最接近偶数模式时调用函数时,以这种方式实现的库往往会失败。出于性能原因,并且由于函数执行时到达的信号会使 FPU 处于舍入到最接近偶数模式,因此更改函数内部的舍入模式不是很可口。在我看来,在任何舍入模式下都能快速、正确舍入的基本函数的最简单方法是,如果人们可以以某种方式依赖在任何舍入模式下工作的双倍算术。

浮点 IEEE-754 双算

评论

1赞 njuffa 4/7/2013
我不知道有任何这样的代码可以独立于舍入模式正常工作。有一篇论文描述了当底层机器算术截断(四舍五入到零)而不是使用四舍五入到最接近时如何实现双原生算术:Hong Diep Nguyen、Stef Graillat 和 Jean-Luc Lamotte。通过四舍五入模式扩展精度,实现零环境。应用于细胞处理器。《可靠性与安全国际杂志》,第3卷,第1/2/3期,2009年。www-anp.lip6.fr/~graillat/papers/IJRS.pdf

答:

2赞 2 revsPascal Cuoq #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)

对于在四舍五入到零模式下的这种特定基本计算,这是一个非常巧妙的修复。它使人们希望实现一个正确的舍入基本函数是可能的,至少通过尽早测试舍入模式并选择单独的算法,或者通过编写适用于所有舍入模式的非常谨慎的代码。

评论

0赞 njuffa 4/7/2013
根据问题的上下文,一种解决方案可能是使用不实现动态舍入模式的平台,而是将舍入模式直接编码到每个浮点指令中。一个例子是 DEC Alpha 架构(它还提供对 dyanmic 舍入的支持)或 GPU。例如,NVIDIA GPU 的 CUDA 环境为原始四种 IEEE 舍入模式中的每一种提供所有基本数学运算的内部函数。例如,这在对间隔算术例程进行编码时非常方便。
0赞 Pascal Cuoq 4/7/2013
@njuffa I dream of a libm that (1) is fast, (2) works regardless of rounding mode, (3) is correctly rounded, but implicitly also (4) runs on my hardware. I know where to get (1)&(3)&(4) or (1)&(2)&(4) or (2)&(3)&(4). Architectures with selectable rounding modes are nice, and I was slightly disappointed that IA64 (which also features them) did not take. The hint about CUDA is very good news indeed.
0赞 Z boson 4/28/2015
@PascalCuoq, the link to the article is broken.
0赞 Pascal Cuoq 4/28/2015
@Zboson Updated. If even academics cannot keep URLs of their articles working, …
0赞 Z boson 4/29/2015
@PascalCuoq, thanks, that link I find a bit easier to read then some of the others. BTW, why did you make your answer community wiki? I just realized you answered your own question. Is this why you made it community wiki? Is this considered good etiquette if you answer your own question?