1. ホーム
  2. c++

[解決済み] クロスプラットフォームの任意精度の数学ライブラリで、移植性の高いものは?[クローズド]

2023-05-06 22:33:21

質問

CまたはC++で良い任意精度の数学ライブラリを探しています。あなたは私にいくつかのアドバイスや提案を与えることができますか?

主な要件です。

  1. それは でなければならない 任意の大きさの整数を扱えること-私の主たる関心は整数です。任意に大きなという言葉が何を意味するのか分からないという方のために、100000!(100000の階乗)のようなものを想像してみてください。(100000の階乗)のようなものを想像してみてください。

  2. 精度は は必要ありません。 をライブラリの初期化時やオブジェクトの生成時に指定する必要はありません。精度は のみです。 のみで、システムの利用可能なリソースによって制限されるべきです。

  3. それは でなければならない はプラットフォームの能力をフルに活用し、「小さな」数をネイティブに処理する必要があります。つまり、64ビットプラットフォームでは、(2^33 + 2^32)の計算は、利用可能な64ビットCPU命令を使用する必要があります。ライブラリは ではありません。 は、同じプラットフォームで (2^66 + 2^65) と同じ方法でこれを計算してはいけません。

  4. それは でなければならない は、加算を効率的に処理する ( + )、減算( - )、掛け算 ( * ), 整数除算 ( / )、余り( % ), べき乗 ( ** ) 、インクリメント ( ++ ), デクリメント ( -- )、GCD、階乗、その他一般的な整数演算を行うことができる。平方根や対数など、整数の結果が出ない関数を扱えることはプラスになります。また 記号計算 を扱えることはさらに良いことです。

これまでに見つけたものを紹介します。

  1. Java 's BigInteger そして 大きな十進数 というクラスがあります。これまで、これらを使ってきました。ソースコードを読みましたが、その下の数学は理解できません。私が学んだことのない理論やアルゴリズムに基づいているのかもしれません。

  2. のコアライブラリでは、組み込みの整数型や bc , Python , ルビー , ハスケル , Lisp , Erlang , OCaml , PHP その他いくつかの言語。私はこれらのいくつかを使用したことがありますが、どのライブラリを使用しているか、どのような実装を使用しているかは全くわかりません。

既に知っていること

  1. 使用方法 char を小数点以下の数字に、そして char* を使い、その桁数で計算をします。 for -ループを使う。

  2. 使用する int (または long int または long long ) を基本的な「単位」とし、その型の配列を任意の長さの整数とし、その要素に計算を行うには for -ループで要素に対して計算を行う。

  3. 整数型を使って、10進数(または数桁)の数字を BCD (2進コード化された10進数) .

  4. ブースの乗算アルゴリズム .

わからないこと

  1. 素朴な方法を使わずに、上記の2進数配列を10進数で表示すること。素朴な方法の一例。(1) ビットの低い方から順に、1, 2, 4, 8, 16, 32, ...と加算していく。 char* -文字列を使用して、中間の10進数の結果を保存する)。

感謝すること

  1. 比較対象は GMP , MPFR , decNumber (または、あなたの意見で良い他のライブラリ)。

  2. 私が読むべき本や記事の良い提案。例えば、「某有名企業」が「某有名企業」を「某有名企業」に変身させる方法を図解入りで教えてくれたり。 素人 2進数から10進数への変換アルゴリズムがどのように機能するかについて、図解があるとよいでしょう。記事 " 限られた精度での2進数から10進数への変換 " by Douglas W. Jones は良い記事の一例です。

  3. 一般的なあらゆるヘルプ。

お願い をしないでください。 を使用することが適切であると思われる場合は、この質問に答えてください。 double (または long double または long long double ) を使えば、この問題は簡単に解決できる。もしそう考えるなら、あなたはこの問題を理解していないことになります。

どのように解決するのですか?

GMPが一般的です。 Squeak Smalltalkには非常に素晴らしいライブラリがありますが、Smalltalkで書かれています。

関連する書籍や論文の紹介をお願いしました。 ビグナムでやっかいなのは長割です。 Per Brinch Hansenの論文をお勧めします。 Multiple-Length Division Revisited: 地雷原を巡る旅 .