浮動小数点の倍精度値x
を 12 (正しく丸められた) 有効数字の 10 進数に変換しようとしています。x
10 ^ 110 と 10 ^ 111 の間にあり、10 進表現が の形式になると想定していx.xxxxxxxxxxxE110
ます。そして、楽しみのために、浮動小数点演算のみを使用しようとしています。
すべての演算が倍精度演算である以下の疑似コードにたどり着きました。表記1e98
は、数学的な 10^98 に1e98_2
最も近い double であり、数学的な減算 10^98- の結果に最も近い double1e98
です。表記は、オペランド、、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命令を備えたコンピューターはありませんが、上記を実行できるコンピューターを見つけたいと思っています。