16

現在、PHP で任意精度の数値を扱う方法を見つけようとしています。したがって、私の最初の質問は、正確には任意精度の数学とは何かということになると思います。私は良い定義のためにグーグルを試しましたが、何らかの理由で誰もそれを十分に簡単な言葉で表現することはできません.

次に、PHP の BCMath ライブラリと GMP ライブラリの違いは何ですか? GMP の API は「より新しい」という主張を聞いたことがありますが、そうではありません。1つが良いですか?

そして私の最後の質問は、BCMath/GMP がどのような種類の数値を取るかということです。明らかに、文字列形式の通常の整数 (例: "5.34") を使用しますが、BCMath 関数が通常の整数を表すオクテット文字列 (例: "\x12\x23\x45\x67") で直接使用されている実装を見てきました。 「bigint」と呼ばれていると聞いたことがありますが、Google からは何も得られませんでした。

4

2 に答える 2

25

任意精度の数学とは正確には何ですか?
任意精度演算、別名「bignum 演算」は、桁数が使用可能なメモリ量によってのみ制限される数値に対して算術演算を実行する方法を導入します。これは、ホスト システムの CPU/ALU によって提供される固定精度演算とは異なり、表現される数値の最大サイズ/精度は、これらのハードウェア プロセッサのレジスタのビット数の係数です。

固定精度演算は高速で、ストレージに関して効率的であり、組み込み/ユニバーサルに利用可能です。ただし、限定された (場合によっては「十分に大きい」場合のみ) 数値範囲に適用できます。任意精度の演算は遅く、ストレージをいくらか浪費し、GMP や BCMath などの特殊なライブラリが必要です。

BCMath ライブラリと GMP ライブラリ
の違いは何ですか? 最も顕著な違いは、GMP が [任意の精度]の整数値で機能することです。これにより、BCMath は [任意の精度]の小数/浮動小数点のような値を許可します。
どちらの API も習得が難しいですが、BCMath はもう少し直感的かもしれません (float のような値をサポートすることに加えて)

別のライブラリよりも特定のライブラリを選択する場合は、通常、使用目的 (または特定のプラットフォームでの可用性) によって決まります。MP アプリケーションに本格的に取り掛かるまでは、ほとんどのライブラリが要件に適合し、一般的に同等です (もちろん、そのクラス内では、つまり、浮動小数点数が必要な場合は整数のみのライブラリは避けてください)。

BCMath/GMP はどのような種類の数値をとりますか?
ほとんどの任意精度の数学パッケージと同様に、これら 2 つのライブラリは API に文字列を使用します。つまり、入力と出力の数値を表します。
内部的に... GMP のような一部のパッケージには、数値の独自の表現があります。このような構造の仕様は、通常、ストレージ要件を最小限に抑えることと、高速な計算を可能にすることとの間の妥協です (このような構造をテキスト ファイルとの間で「シリアル化/逆シリアル化」することを含む)。
の例は、 BCD 、つまり Binary Coded Decimal"\x12\x23\x45\x67"として知られてい1 バイトあたり 2 桁の 10 進数を格納でき、任意精度演算ライブラリで使用されることがあります。

于 2011-08-05T23:45:40.310 に答える
5

GMPは1トン高速なBCMathですが、OpenSSLを使用するとBCMathを高速化できます。さまざまな手法を比較したベンチマークは次のとおりです。

http://phpseclib.sourceforge.net/math/intro.html

于 2012-10-10T18:44:15.653 に答える