標準 ML に相当する Java BigInt はありますか? 通常の int 型は、オーバーフローすると例外がスローされます。
5 に答える
はい、IntInf構造体を参照してください。
公式の SML'97 標準基底ライブラリでは、Int、IntInf、Int32、Int64、LargeInt などの構造の動物園が導入されています。
それらを実際に実際に使用して、物事が期待どおりに機能し、効率的に機能するようにするには、手元の SML 実装を詳しく調べる必要があります。
実装の 1 つのファミリは C と Java のメモリ レイアウトを模倣するため、Int32 は実際には 32 ビットのマシン ワード (オーバーフロー チェックあり) であり、Int64 は 64 ビットのマシン ワードです。SML/NJ はその顕著な例であり、その小さな int 演算は高速ですが、大きな int 演算は低速です。
実装の別のファミリーは、シンボリック計算 (LISP またはコンピューター代数) の背景から来ており、Poly/ML が注目すべき例です。ここでは、デフォルトで Int = IntInf = LargeInt があり、実装は最初にネイティブ マシン ワード (の一部) を近似値として使用し、オーバーフローしてから、ヒープに (ボックス化された値として) 割り当てられた非常に大きな整数に切り替えます。Poly/ML は、その大部分に GNU MP ライブラリを使用します。
したがって、Int/IntInf は、アプリケーションが特定のサイズの機械語ではなく整数に関するものである限り、非常に効率的です。シンボリック モデルの Int32 は、余分なタグ ビットが必要なため、32 ビット ハードウェアでは 1 つの単語に収まりません。そのため、32 ビット ハードウェアの SHA1 など、実際には単語演算に関する一部のアルゴリズムは劣化します。
一方、単語サイズよりも短い int をヒープに割り当てられた big int に暗黙的にアップグレードすると、Java の BigInt よりも優れたものになります。これは、小さな値のオブジェクト オーバーヘッド全体を必要としないためです。42 はほんの少しです。レジスタ内のパターン (追加のタグ ビットを使用) ですが、ヒープ上の重いボックスではありません。
BigInt に相当するものは LargeInt と呼ばれます。これらのレクチャー ノートを参照して、int (別名 Int) と LargeInt の間の変換方法に関するいくつかの関数を確認してください。
これはまさにあなたが求めていたものではありませんが、実際には Java BigInt クラスに相当するものは必要ありません。Java の BigInt クラスは、O(n log n) ではなく、O(n^2) 時間の乗算 (基本的に小学校で教えられている方法で乗算) を実装しています。多くの単純な BigInt プログラミングは単に n^2 バージョンでは機能しないため、これは非常に重要です。
まあ、int は、順列の計算などに厄介な制限を課します。SML には、より自然に使用できる大きな数値データ型が必要です。