我正在尝试将浮点双精度值转换x
为具有 12 个(正确舍入)有效数字的十进制值。我假设它x
在 10^110 和 10^111 之间,因此它的十进制表示形式为x.xxxxxxxxxxxE110
. 而且,只是为了好玩,我只尝试使用浮点运算。
我到达了下面的伪代码,其中所有操作都是双精度操作,符号1e98
是最接近数学 10^98 的双精度数,1e98_2
是最接近数学减法 10^98- 的结果的双精度数1e98
。该符号适用于带有操作数, ,fmadd(X * Y + Z)
的融合乘加运算。X
Y
Z
y = x * 2^-1074; // exact
q = y / 1e98; // q is denormal and the significand of q interpreted
// as an integer is our candidate for the 12 decimal
// digits of x
r = fmadd(q * 1e98 - y); // close to 1e98 * (error made during the division)
// If 1e98_2 >= 0, we divided by a number that was smaller than we wished
// The correct answer may be q or q+1.
if (r and 1e98_2 have opposite signs)
{
return the significand of q;
}
s = copysign(2^-1074, r);
r1 = abs(r);
r2 = abs(1e98_2);
h = 1e98 * 0.5 * 2^-1074;
Set rounding mode to downwards
r3 = fmadd(r2 * q + r1);
if (r3 < h)
{
return the significand of q;
}
else
{
return significand of (q + s)
}
对于上述伪代码所造成的混乱,我深表歉意,但对我来说还不是很清楚,因此有以下问题:
第一个 fmadd 是否按预期工作(计算 1e98 *(除法期间出错))?
标志。我无法说服自己他们是对的。但我也无法说服自己他们是错的。
关于这个算法可能产生错误结果的频率的任何想法,也许是争论?
如果它确实有效,如果将“q = y / 1e98”更改为“q = y * 1e-98”(保持所有其他指令相同),算法是否有可能继续工作?
我没有测试过这个算法。我没有任何带有 fmadd 指令的计算机,尽管我希望能找到一台这样我就可以执行上述操作。