コンテキスト: 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.0000000000001p60
e
-0x0.0000000000001p60
a
b
テイクととa == 0x1.0p120
の数学的合計はa
、もうb
一方では一致しません。s
e
質問
典型的な double-double ライブラリが最近接偶数への丸め (つまり、比較的高速で比較的正確) にあるのと同じプロパティを持つ double-double のようなライブラリを構築する方法はありますか?モードはたまたまですか?
そのようなライブラリはすでに存在しますか?
より一般的なコンテキスト: 正しく丸められた初等関数
double-double ソートの実装は、正しく丸められた初等関数のライブラリの実装における中間計算に使用されます。その結果、この方法で実装されたライブラリは、FPU が最も近い偶数への丸めモードでないときに関数が呼び出されると、見事に失敗する傾向があります。関数内で丸めモードを変更することは、パフォーマンス上の理由と、関数の実行中に到着する信号が FPU を最も近い偶数への丸めモードのままにするため、あまり好ましくありません。どの丸めモードでも機能する高速で正確に丸められた初等関数を持つ最も簡単な方法は、どの丸めモードでも機能する double-double 種類の演算に何らかの形で依存できる場合です。