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
,…就是这样。
在mh
和ml
中得到的值可以重叠,因此最后3个操作将结果重新规范化为两个浮点数的和。
在这种情况下,我们可以在每个双精度上有舍入错误,或者他们是否有一种机制来避免这种情况?
正如注释所说:
/*
* computes double-double multiplication: zh+zl = (xh+xl) * (yh+yl)
* relative error is smaller than 2^-102
*/
您可以在《浮点算术手册》中找到用于实现这些结果的所有机制。