Floating point 双精度实现对FPU舍入模式具有弹性 上下文:双精度算术

Floating point 双精度实现对FPU舍入模式具有弹性 上下文:双精度算术,floating-point,ieee-754,double-double-arithmetic,Floating Point,Ieee 754,Double Double Arithmetic,“Double Double”在有效位中没有重叠。这种表示利用现有的双精度硬件实现进行“近四倍精度”计算 在双精度实现中,一个典型的低级C函数可能采用两个双精度数字a和b,以及|a |≥ |b |并计算表示其总和的双精度数(s,e): s = a + b; e = b - (s - a); (改编自。) 这些实现通常采用四舍五入到最近的偶数模式。 在上面的计算中,(s,e)仅因为这个假设才是标准化的双精度。如果没有它,a==0x1.0p60,b==1,在向上舍入模式下,s计算为0x1.0000

“Double Double”在有效位中没有重叠。这种表示利用现有的双精度硬件实现进行“近四倍精度”计算

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

s = a + b;
e = b - (s - a);
(改编自。)

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

在上面的计算中,
(s,e)
仅因为这个假设才是标准化的双精度。如果没有它,
a==0x1.0p60
b==1
,在向上舍入模式下,
s
计算为
0x1.0000000000001p60
e
略高于
-0x0.0000000000001p60
。它们的和等于
a
b
的数学和,但它们的有效位重叠

a==0x1.0p120
为例,一方面
a
b
的数学和,另一方面
s
e
的数学和不再一致

问题: 有没有一种方法可以构建一个类似于double-double的库,该库的属性与典型的double-double库在舍入到最接近偶数(即,相对快速和相对准确)时的属性相同,但不管舍入模式是什么,它都可以工作

这样的图书馆已经存在了吗

更一般的上下文:正确舍入的初等函数 双排序的实现用于实现正确舍入的初等函数库中的中间计算。因此,以这种方式实现的库倾向于。由于性能原因,以及函数执行时到达的信号将使FPU处于最接近的偶数模式,因此在函数内部更改舍入模式不是很合适。我所看到的在任何舍入模式下工作的快速、正确舍入的基本函数的最简单方法是,如果一个人能够以某种方式依赖于在任何舍入模式下工作的双精度算术。

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)
2−总和−朝向−零2(a,b)
如果(|a |<|b |)
互换(a、b)
s=fl(a+b)
d=fl(s− (a)
e=fl(b)− (d)
如果| 2∗ njuffa提到的b |提供了以下功能,其符号与我的问题非常相似,除了表示为
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)
2−总和−朝向−零2(a,b)
如果(|a |<|b |)
互换(a、b)
s=fl(a+b)
d=fl(s− (a)
e=fl(b)− (d)

如果| 2∗ b |我不知道有任何这样的代码能够独立于舍入模式正常工作。有一篇文章描述了当底层机器算法截断(舍入为零)时如何实现双本机算法Hong Diep Nguyen、Stef Graillat和Jean-Luc Lamotte。使用舍入模式向零环境扩展精度。细胞处理器的应用。Int.J.可靠性和安全,第3卷,第1/2/3期,2009。我不知道有任何这样的代码可以独立于舍入模式正常工作。有一篇论文它描述了当底层机器算法截断(舍入为零)时如何实现双本机算法Hong Diep Nguyen、Stef Graillat和Jean-Luc Lamotte。使用零环境舍入模式的扩展精度。细胞处理器的应用。Int.J.可靠性和安全,第3卷,第1/2/3期,2009。根据问题的上下文,一种解决方案可能是使用不实现ent动态舍入模式,但将舍入模式直接编码到每个浮点指令中。DEC Alpha架构就是一个例子(它还支持动态舍入),或GPU。例如,NVIDIA GPU的CUDA环境为原始四种IEEE舍入模式中的每种模式的所有基本数学运算提供了内部函数。这在编写区间算术例程时非常方便,例如。@njuffa我梦想一个libm(1)速度快,(2)无论舍入模式如何,(3)都能工作是正确的舍入,但也隐含着(4)在我的硬件上运行。我知道在哪里可以得到(1)和(3)和(4)或(1)和(2)和(4)或(2)和(3)和(4)。具有可选舍入模式的架构很好,我对IA64(它也具有这些功能)有点失望没有接受。关于CUDA的提示确实是个好消息。@PascalCuoq,文章的链接已断开。@Zboson已更新。如果连学者的文章URL都无法正常工作,@PascalCuoq,谢谢,我发现这个链接比其他链接更容易阅读。顺便问一句,你为什么要在社区维基上给出答案?我刚刚意识到你的答案是正确的这就是为什么你把它变成了社区维基吗?如果你回答自己的问题,这被认为是良好的礼仪吗?根据你问题的上下文,一种解决方案可能是使用一个平台,该平台不实现动态舍入模式,而是将舍入模式直接编码到每个浮点指令中。考试ple将是DEC Alpha体系结构(也支持动态舍入),或GPU。例如,NVIDIA GPU的CUDA环境为原始四种IEEE舍入模式中的每种模式的所有基本数学运算提供了内部函数。这在编写区间算术例程时非常方便,例如。@njuffa我梦想一个libm(1)速度快,(2)无论舍入模式如何工作,(3)正确