Float128和双双算术

float128 and double-double arithmetic

本文关键字:Float128      更新时间:2023-10-16

我在维基百科上看到,实现四精度的方法是使用双双算术,即使它在比特方面的精度不完全相同:https://en.wikipedia.org/wiki/Quadruple-precision_floating-point_format

在本例中,使用了两个double来存储值。因此,我们执行两个操作来计算结果,每个操作对应结果的双精度。

在这种情况下,我们可以在每个双精度上有舍入错误,或者他们是否有一种机制来避免这种情况?

"在这种情况下,我们使用两个double来存储值。因此,我们每次需要进行两次操作。"

这不是double-double算法的工作原理。您应该期望在6到20个双操作中实现一个双操作,这取决于要实现的实际操作、融合乘加操作的可用性、一个操作数大于另一个操作数的假设,…

例如,当FMA指令不可用时,这里有一个双双乘法的实现,摘自CRlibm:

#define Mul22(zh,zl,xh,xl,yh,yl)                      
{                                                     
double mh, ml;                                        
                              
  const double c = 134217729.;                
  double up, u1, u2, vp, v1, v2;              
                              
  up = (xh)*c;        vp = (yh)*c;            
  u1 = ((xh)-up)+up;  v1 = ((yh)-vp)+vp;          
  u2 = (xh)-u1;       v2 = (yh)-v1;                   
                              
  mh = (xh)*(yh);                     
  ml = (((u1*v1-mh)+(u1*v2))+(u2*v1))+(u2*v2);        
                              
  ml += (xh)*(yl) + (xl)*(yh);                
  *zh = mh+ml;                        
  *zl = mh - (*zh) + ml;                              
}

仅前8个操作用于将操作数中的每个双精度数精确地分成两半,以便每一边的一半可以与另一边的一半相乘,得到的结果正好是double。计算u1*v1, u1*v2,…就是这样。

mhml中得到的值可以重叠,因此最后3个操作将结果重新规范化为两个浮点数的和。

在这种情况下,我们可以在每个双精度上有舍入错误,或者他们是否有一种机制来避免这种情况?

正如注释所说:

/*
 * computes double-double multiplication: zh+zl = (xh+xl) *  (yh+yl)
 * relative error is smaller than 2^-102
 */

您可以在《浮点算术手册》中找到用于实现这些结果的所有机制。