1

コンテキスト: double-double 算術

「Double-double」は、2 つの倍精度数の仮数部の重なりのない和としての数の表現です。この表現は、既存の倍精度ハードウェア実装を利用して、「ほぼ 4 倍精度」の計算を行います。

double-double 実装の典型的な低レベル C 関数の 1 つは、2 つの倍精度数を取りa、それらの合計を表すdouble-double 数を計算しbます。|a| ≥ |b|(s, e)

s = a + b;
e = b - (s - a);

(この記事から改作。)

これらの実装では、通常、最も近い偶数への丸めモードが想定されています。

上記の計算で(s, e)は、 は正規化された double-double です。これは、この仮定のためだけです。それがなければ、a == 0x1.0p60切り上げb == 1モードでは、 がと少し上にs計算されます。それらの合計はandの数学的な合計に等しくなりますが、仮数部は重複します。0x1.0000000000001p60e-0x0.0000000000001p60ab

テイクととa == 0x1.0p120の数学的合計はa、もうb一方では一致しません。se

質問

典型的な double-double ライブラリが最近接偶数への丸め (つまり、比較的高速で比較的正確) にあるのと同じプロパティを持つ double-double のようなライブラリを構築する方法はありますか?モードはたまたまですか?

そのようなライブラリはすでに存在しますか?

より一般的なコンテキスト: 正しく丸められた初等関数

double-double ソートの実装は、正しく丸められた初等関数のライブラリの実装における中間計算に使用されます。その結果、この方法で実装されたライブラリは、FPU が最も近い偶数への丸めモードでないときに関数が呼び出されると、見事に失敗する傾向があります。関数内で丸めモードを変更することは、パフォーマンス上の理由と、関数の実行中に到着する信号が FPU を最も近い偶数への丸めモードのままにするため、あまり好ましくありません。どの丸めモードでも機能する高速で正確に丸められた初等関数を持つ最も簡単な方法は、どの丸めモードでも機能する double-double 種類の演算に何らかの形で依存できる場合です。

4

1 に答える 1

1

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)

これは、ゼロ方向への丸めモードの場合、この特定の初等計算に対する非常に適切な修正です。少なくとも丸めモードを早期にテストして別のアルゴリズムを選択するか、おそらくすべての丸めモードで機能する非常に慎重なコードを書くことによって、正しく丸められた初等関数を実装するための何かが可能になるという希望があります。

于 2013-04-06T19:40:44.623 に答える