12

さまざまな浮動小数点演算の安定性を維持するための戦略を含む C++ ライブラリ/ルーチン/パッケージを推奨できますか?

例: 単位間隔 (0,1) で 100 万のベクトル/配列を合計したいとlong doubleします。各数値はほぼ同じ桁数です。単純な合計for (int i=0;i<1000000;++i) sum += array[i]; は信頼できません。十分iに大きい場合、sumは よりもはるかに大きな桁になるarray[i]ため、 とsum += array[i]同等になりsum += 0.00ます。(注: この例の解決策は、2 値合計法です。)

私は、数千/数百万の微小確率の和と積を扱います。MPFRC++有効桁数が 2048 ビットの任意精度ライブラリを使用していますが、同じ懸念事項が依然として当てはまります。

私は主に次のことに関心があります。

  1. 多くの数値を正確に合計するための戦略 (上記の例など)。
  2. 乗算と除算が不安定になる可能性があるのはいつですか? (多数の数値配列を正規化する場合、正規化定数はどうすればよいですか?最小値?最大値?中央値?)
4

1 に答える 1

6

バイナリの合計は、正確な結果を保証するものではありません。最も信頼できる(遅いですが)方法は、カハンの加算を使用することです。Boost.Accumulatorsには、上記およびその他の多くの実装があります。

乗算と除算の安定性:非正規化されたフロートに到達しない限り、それらは合計と減算と同じ問題に悩まされることはありません。実際、乗算の誤差は最大で0.5 ulp(単位は最後の場所)です。

...正規化定数はどうあるべきですか?

「正規化」とはどういう意味ですか?それはあなたが使う規範に依存します。考えられる候補:配列の最大絶対値、またはその他の一般化された平均を使用します。(リストした他の選択肢は、ゼロ以外の配列でもゼロになる可能性があるため、機能しません。)

于 2012-06-29T16:04:11.433 に答える