web-dev-qa-db-ja.com

BigIntegerに上限はありますか?

可能性のある複製:
制限のないBigIntegerの意味

BigIntegerのJavadocは、最大値または最小値を定義しません。しかし、それは言う:

(強調を追加)

不変任意精度整数

理論的にさえ、そのような最大値はありますか?または、BigIntegerの動作方法が根本的に異なり、実際にはコンピューターで使用可能なメモリ量を除いてno最大値がありますか?

72
asteri

番号はint[]に保持されます-配列の最大サイズはInteger.MAX_VALUEです。したがって、おそらくBigIntegerの最大値は(2 ^ 32) ^ Integer.MAX_VALUEです。

確かに、これは実装に依存しており、仕様の一部ではありません。


Java 8では、いくつかの情報が BigInteger javadoc に追加され、サポートされる最小範囲と現在の実装の実際の制限が示されました。

BigInteger-2の範囲の値をサポートする必要がありますInteger.MAX_VALUE (排他的)+2Integer.MAX_VALUE (排他的)、その範囲外の値をサポートする場合があります。

実装に関するメモ:BigIntegerコンストラクターと操作は、結果が-2のサポートされている範囲外にあるときにArithmeticExceptionをスローしますInteger.MAX_VALUE (排他的)+2Integer.MAX_VALUE (排他的)。

67
assylias

BigIntegerは、小数ではないことがわかっており、longデータ型が十分に大きくない可能性がある場合にのみ使用されます。 BigIntegerの最大サイズには上限がありません(コンピューターのRAMが保持できる限り)。

here から。

int[]を使用して実装されます:

  110       /**
  111        * The magnitude of this BigInteger, in <i>big-endian</i> order: the
  112        * zeroth element of this array is the most-significant int of the
  113        * magnitude.  The magnitude must be "minimal" in that the most-significant
  114        * int ({@code mag[0]}) must be non-zero.  This is necessary to
  115        * ensure that there is exactly one representation for each BigInteger
  116        * value.  Note that this implies that the BigInteger zero has a
  117        * zero-length mag array.
  118        */
  119       final int[] mag;

から ソース

ウィキペディアの記事から 任意精度の計算

いくつかの最新のプログラミング言語には、bignumの組み込みサポートがあり、他のプログラミング言語には、任意精度の整数および浮動小数点演算に使用できるライブラリがあります。これらの実装では、プロセッサレジスタのサイズに関連する固定数のバイナリビットとして値を保存するのではなく、通常、可変長の数字配列を使用します。

19
embedded.kyle

ヒットする最初の最大値は、2の文字列の長さです31-1桁。 BigIntegerの最大値よりはるかに小さいですが、印刷できない場合、IMHOはその値の多くを失います。

10
Peter Lawrey