問題タブ [multiprecision]
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++ - boost multiprecision/mpfr float の操作 - 文字列を有効な整数エラーとして解釈できませんでした
非常に大きな数で単純な算術演算を実行するプログラムを作成しました。boost multiprecision ライブラリの mpz_int と mpf_float を使用することに成功しましたが、目的を達成するにはさらに精度が必要であることがわかりました。mpfr ライブラリを使用して、精度の高い float を定義しようとしています。コードをコンパイルすることはできましたが、実行時エラー libc++abi.dylib: terminating with uncaught exception of type boost::exception_detail::clone_impl >: The string “1572…[4000 digits]…00.328” could有効な整数として解釈されません。
作成した mpfr_float を整数に変換しようとしているのが問題の原因であると感じています。整数である文字列から float を初期化し、切り捨てて整数に変換する前に何らかの除算を行います。これが私のtypedefです:
私の宣言:
そして私の試みた変換:
この変換を実行して実行時エラーを回避するために誰かが私を助けてくれたら、とても感謝しています。私の混乱の原因はそれよりも深いところにあるのではないかと思うので、私のプロジェクトについて少し説明したいと思います。そして、私がしていることでもっと根本的に間違っていることがあるかどうか誰か教えていただけないでしょうか。
ランダムに見えるテキストのページを作成しようとしていますが、予測可能な疑似ランダム関数で構成されています。そのため、誰かが 1、次に 2、次に 3 を入力した場合、テキストの 3 ページ間にパターンがないことに気付くでしょうが、これらの数字のいずれかを入力すると、毎回同じテキストが返されます。29 文字のページのすべての可能性を 3200 回、つまり 29^3200 (約 10^4680) の可能性で作成しようとしています。
ホルトン シーケンスを使用して疑似ランダム品質を生成し、結果に 29^3200 を掛けています。
これが私のハルトンシーケンスです:
次に、結果の数値を基数 29 に基数変換して、1 ページのテキストを取得します。最初は mpz_int を 29^3200 (文字列から初期化) に使用しましたが、これは繰り返しパターンを生成することがわかりました。ホルトン シーケンスの分母が何であるかによって異なります。たとえば、分母 243 を生成する入力は、同じ 162 文字が 3200 文字から繰り返されるテキストのページを生成しますが、位置が異なります。
私のプログラムの基本変換セグメントは次のとおりです。
この繰り返しがなぜ起こったのかを理解するのに十分な数学の感覚はありませんが、直感でフロートに変更しました。これははるかに優れていることがわかりました。パターンははるかに短く、出力文字列の先頭 (より高い値を表す) にのみ表示され始めますが、最終的にはまだそこにあり、認識可能でした. mpf_float は mpf_float_1000 よりもうまく機能し、よりランダムに見える結果を生成するという点で、どちらも mpz_int よりもはるかに優れていることがわかりました。
前に述べたように、私の表面的な質問は単純です: この実行時エラーを回避するにはどうすればよいですか? しかし、私のより深い懸念は次のとおりです。a) なぜこれらのパターンが現れるのか? 精度の高い浮動小数点数がこれらの繰り返し文字列を排除するのは正しいですか? b) その場合、mpfr_float は最適なデータ型ですか? どの程度の精度を与えるべきですか?c) そうでない場合、どのデータ型を使用すればよいですか?
これらの質問に答えてくれる人にはとても感謝しています。
- -編集 - -
29^3280 をシードとして使用し、mpf_float に固執し、反復的な文字である最後の 80 文字を切り取るだけで、私が抱えていた問題を解決しました。ただし、固定精度と可変精度についてはまだ興味があります。より高いテンプレート パラメータを使用して固定精度 gmp_float を定義しようとすると、さらに悪い結果が得られました。固定精度と可変精度とは正確には何ですか?また、なぜそのような結果が得られるのでしょうか?
c++ - boost::multiprecision::mpfr_float を使用した Eigen3 動的マトリックス
行列を作成し、Eigen3 ライブラリを使用して使用したいと思います。数値型は Boost.Multiprecision の mpfr_float ラッパーです。行列をうまく作成できますが、行列の追加を除いて、私が試したすべての操作で失敗します。2 つの恒等行列を乗算するだけで、ガベージ結果が生成されます。
MWE は次のとおりです。
単位行列は問題なく生成されますが、私のマシンでは、このコードの依存関係の最新の自作配布バージョン (およびその他) (Boost 1.57、Eigen 3.2.4) を使用して、私のプログラムは NaN を行列内の 1 行おきに生成します。 :
行列のサイズが奇数の場合、下部に 2 行の nan が生成されます...
NumTraits
これは、デフォルトの精度、定義する構造体の詳細、または定義するかどうかにも依存していないようです。から継承できるGenericTraits<mpfr_float>
かどうか。RequireInitialization = 1
、またはと言え0
ます。NaN を取得します。連立方程式を解くために LU 反転を試みると、返される行列は完全に NaN になります。行列のサイズが 1x1 の場合、行列の乗算から NaN が 1 つ得られます。さまざまな静的関数を変更しても影響はありません。
最も奇妙な部分は、mpfr_float を実部と虚部の基礎となる型としてカスタムの複雑なクラス (データ損失の理由から std::complex ではない) を定義すると、関数行列が得られることです。
edit : 複合型の NumTraits は次のとおりです。
私が書いた複雑なクラスは次のとおりです。
私は何を間違っていますか?行列演算を正しく機能させるために、Eigen / NumTraits / などに何ができますか?
python - Numpy行列演算でgmpy2 mpfrの精度を保つ方法
Numpy 行列で多精度 Rational(mpfr) オブジェクトを使用しています。
しかし、行列の逆数を計算すると、精度が失われます。
では、mpfr の精度を維持するにはどうすればよいでしょうか。どんな提案でも大歓迎です!
c++ - boost::multiprecision データ型をバイナリ ファイルに書き込む
boost::multiprecision::uint128_t
128 ビット値に対してビット演算を実行するために型を使用していました。ただし、128 ビット値をバイナリ ファイルに書き出すのに問題があります。具体的には、値をゼロで埋める必要があります。
例として、uint128_t
値が0x123456
16進エディタでファイルを見ている場合、次のシーケンスが必要です。
56 34 12 00 00 00 00 00 00 00 00 00 00 00 00 00
代わりに、バイナリ ファイルは次の値で終了します。
56 34 12 00 CC CC CC CC CC CC CC CC CC CC CC
テンプレートのブースト バックエンドがuint128_t
、128 ビットを 4 つの 32 ビット値として格納しているように見えます。また、使用中の 32 ビット値の数を示す「リム」値があります。32 ビット値が使用されていないときは、0xCCCCCCCC
. したがって、ofstream.write
は文字の配列を調べて を書き出し0xC
ます。
これを正しく書き出すためにブースト ライブラリに欠けているものはありますか?それとも、uint128_t
値を別のデータ型に変換する必要がありますか?
c++ - 三角関数でブースト多重精度を使用する
ブーストを使用して多倍精度浮動小数点数 ' a ' を作成する次のコードを考えてみましょう。
ブースト ライブラリを使用して三角関数を呼び出すにはどうすればよいですか? たとえば、sin(a)を計算したいと考えています。
boost - boost::rational でうまく機能する (C++ 固有の) 無制限の整数クラスはどこにありますか?
私は、分子と分母が long long int の制限をはるかに超える有理数を扱いたいと考えています。boost::rational は、無制限の整数型用に特別に設計された優れたクラスです。しかし、C++ に存在する無制限の整数型を調べると、これまでに推奨されているのは GMP だけです。GMP は C 用に設計されているため、面倒なメモリ管理が必要です。boost::rational でうまく機能する無制限の整数型を含む C++ (C ではない) ライブラリは存在しますか?
c++ - なぜ std::unordered_map も boost::unordered_map も boost::multiprecision 型で使用できないのですか?
STL
(またはboost
)タイプunordered_map
を作成しようとしていますが、このコンテナーに要素を挿入しようとするとエラーがスローされます。boost::mulprecision
cpp_int
gcc
完全なエラーログはこちら
最初のエラー:
STL
/の多重精度型boost
に関するコンテナの使用に制限はありboost
ますか? ブースト1.54を使用しています。
編集:
これが重複している可能性があるという問題は、boost 1.56 で追加されたシリアライゼーション サポートを使用boost::multiprecision
しています (少なくともドキュメント@1.55と@1.56の違いによると) 。
また、その質問では、シリアライゼーションのサポートなしでこの問題を解決するために言及された他のアプローチはありませんでしたboost::multiprecision
。