私のプロジェクトでは、double
要素の行列で除算、乗算、減算、加算を計算する必要があります。問題は、行列のサイズが大きくなると、出力の精度が大幅に影響を受けることです。現在、メモリdouble
を使用していると思われる要素ごとに使用しており、小数点以下の桁数8 bytes
に関係なく精度があります16 digits
。マトリックスのサイズが大きい場合でも、すべての要素が占めるメモリは数キロバイトの範囲です。datatypes
だから私はより多くのメモリを必要とするものを使う余裕があります。そのため、どのデータ型がより正確であるかを知りたいと思いましたdouble
。いくつかの本を検索してみましたが、見つけることができlong double
ました。しかし、私はその精度が何であるかわかりません。そして、それよりも高い精度が必要な場合はどうなりますか?
4 に答える
Wikipediaによると、80ビットの「Intel」IEEE 754拡張精度 long double
は、メモリ内の16ビットに80ビットが埋め込まれ、64ビットの仮数を持ち、暗黙のビットがないため、10進数で19.26桁になります。これは昔からほぼ普遍的な基準でしlong double
たが、最近では状況が変わり始めています。
新しい128ビットの四倍精度形式には、112の仮数ビットと、34桁の10進数を取得する暗黙のビットがあります。GCCはこれを__float128
型として実装し、(メモリが機能する場合は)それに設定するコンパイラオプションがありますlong double
。
操作のシーケンスを検討することをお勧めします。つまり、最小値から順に追加を実行します。これにより、仮数で同じ精度を使用して、結果の全体的な精度が向上します。
1e00 + 1e-16 + ... + 1e-16 (1e16 times) = 1e00
1e-16 + ... + 1e-16 (1e16 times) + 1e00 = 2e00
重要なのは、大きな数に小さな数を追加すると、それらが消えるということです。したがって、後者のアプローチは数値誤差を減らします
double
コンパイラとアーキテクチャに依存するよりも高い精度の浮動小数点データ型。
精度以上のものを取得するにdouble
は、任意精度の計算をサポートする数学ライブラリに依存する必要がある場合があります。しかし、これらはおそらく速くはないでしょう。
Intelアーキテクチャでは、の精度long double
は80ビットです。
どんな価値観を表現したいですか?たぶん、固定精度を使用したほうがよいでしょう。