CまたはC++で適切な任意精度の数学ライブラリを探しています。アドバイスや提案をお願いします。
主な要件:
任意の大きさの整数を処理する必要があります。私の主な関心は整数です。恣意的に大きいという言葉が何を意味するのかわからない場合は、100000のようなものを想像してみてください。(100000の階乗)。
ライブラリの初期化またはオブジェクトの作成中に精度を指定する必要はありません。精度は、システムの利用可能なリソースによってのみ制約される必要があります。
プラットフォームの能力をフルに活用し、「小さな」数をネイティブに処理する必要があります。つまり、64ビットプラットフォームでは、(2 ^ 33 + 2 ^ 32)の計算には使用可能な64ビットCPU命令を使用する必要があります。ライブラリは、同じプラットフォームで(2 ^ 66 + 2 ^ 65)を使用する場合と同じ方法でこれを計算するべきではありません。
加算( )、減算()、乗算()、整数除算()、剰余()、累乗()、増分()、減分()、GCD、階乗、およびその他の一般的な整数算術計算を効率的に処理する必要があります。整数の結果を生成しない平方根や対数などの関数を処理する機能はプラスです。記号計算を処理する機能はさらに優れています。
+
-
*
/
%
**
++
--
これが私がこれまでに見つけたものです:
JavaのBigIntegerおよびBigDecimalクラス:私はこれまでこれらを使用してきました。ソースコードを読みましたが、その下の計算がわかりません。それは私が学んだことのない理論やアルゴリズムに基づいているのかもしれません。
組み込み整数型またはbc、Python、Ruby、Haskell、Lisp、Erlang、OCaml、PHP、その他の言語のコアライブラリ:これらのいくつかを使用しましたが、どのライブラリを使用しているかわかりません。彼らが使用している実装の種類。
私がすでに知っていること:
char
10進数字と10進文字列に使用char*
し、-loopを使用して数字の計算を行いますfor
。int
(または、、long int
またはlong long
)を基本的な「単位」として使用し、そのタイプの配列を任意の長整数として使用し、for
-loopを使用して要素の計算を行います。整数型を使用して、10進数(または数桁)をBCD(2進化10進数)として格納します。
私が知らないこと:
- 単純な方法を使用せずに、上記のバイナリ配列を10進数で印刷します。単純な方法の例:(1)ビットを最低から最高に追加します:1、2、4、8、16、32、…(2)
char*
上記の-文字列を使用して中間の小数の結果を格納します)。
私が感謝すること:
私が読むべき本や記事に関する良い提案。たとえば、ナイーブでない2進化10進変換アルゴリズムがどのように機能するかを図で示したものが適切です。DouglasW.Jonesによる記事「<strong>制限付き精度での2進数から10進数への変換」は良い記事の例です。
一般的なヘルプ。
(または、、または)を使用するとこの問題を簡単に解決できると思われる場合は、この質問に答えないでください。そう思うと、問題の問題を理解できません。double
long double
long long double