問題タブ [double-double-arithmetic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 2つの「フロート」を使用して「ダブル」をエミュレートします
32ビット単精度浮動小数点演算のみをサポートする組み込みハードウェア用のプログラムを作成しています。ただし、私が実装しているアルゴリズムには、64ビットの倍精度の加算と比較が必要です。double
2つのタプルを使用してデータ型をエミュレートしようとしていfloat
ます。したがって、aはタプルを含むものdouble d
としてエミュレートされます。struct
(float d.hi, float d.low)
比較は、辞書式順序を使用して簡単に行う必要があります。ただし、どのベースを使用すればよいかわからないため、追加には少し注意が必要です。それはすべきFLT_MAX
ですか?そして、どうすればキャリーを検出できますか?
これはどのように行うことができますか?
編集(明確さ):余分な範囲ではなく、余分な有効数字が必要です。
floating-point - 2 つの double の合計としての倍精度浮動小数点数
しばらくの間double-double 算術の論文とソース コードをたどっていますが、 dd_real ( として定義されているstruct dd_real { double x[2];...}
) 数値が 2 つの double にどのように分割されるかはまだわかりません。文字列で初期化すると、 と はどうdd_real pi = "3.14159265358979323846264338327950";
なるでしょうか? 私はそれを理解し、できればそれを行う小さな Python 関数を作成する必要があります。pi.x[0]
pi.xi[1]
QD ライブラリを呼び出したくない理由は、Python で正しい分割を再実装して、35 桁の精度定数 (文字列として指定)double2
を CUDA コードに送信することを好むからです。 GQD ライブラリによって double-double reals として扱われます。これは、CUDA で拡張精度計算を処理する唯一のライブラリのようです。残念ながら、Python 側では mpmath も除外されます。
floating-point - FPU 丸めモードに耐性のある double double 実装
コンテキスト: double-double 算術
「Double-double」は、2 つの倍精度数の仮数部の重なりのない和としての数の表現です。この表現は、既存の倍精度ハードウェア実装を利用して、「ほぼ 4 倍精度」の計算を行います。
double-double 実装の典型的な低レベル C 関数の 1 つは、2 つの倍精度数を取りa
、それらの合計を表すdouble-double 数を計算しb
ます。|a| ≥ |b|
(s, e)
(この記事から改作。)
これらの実装では、通常、最も近い偶数への丸めモードが想定されています。
上記の計算で(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 種類の演算に何らかの形で依存できる場合です。
c++ - float128 と double-double 演算
ウィキペディアで、4倍精度を実装するには、ビットに関して正確に同じ精度でなくても、倍精度演算を使用することであることがわかりました: https://en.wikipedia.org/wiki/Quadruple-precision_floating-point_format
この場合、2 つの double を使用して値を格納します。そのため、結果を計算するために 2 つの操作を行います。結果の double ごとに 1 つです。
この場合、各 double に丸め誤差が発生する可能性がありますか、それともこれを回避するメカニズムですか?