Python3の整数int型に最大値はない(上限なし)

Modified: | Tags: Python, 数値

Python2の整数型にはintlongの2つの型があったが、Python3にはintしかない。Python3のintはPython2のlongに相当し、最大値の上限はなく、メモリの許す限り大きな値を扱うことが可能。

浮動小数点数float型の取り得る範囲(最大値・最小値)については以下の記事を参照。

なお、NumPyではint32(32ビット整数型)やint64(64ビット整数型)のようにビット数が固定のデータ型が用いられる。

Python2の整数int型と長整数long型

Python2では通常の整数型のint型と長整数型のlong型があった。

intの取り得る最大値はsys.maxintで取得可能。最小値(最大の負の数)は-sys.maxint - 1となる。

sys.maxintは最低でも2**31-1、64bit環境では2**63-1となる。

long型には最大値・最小値の制限はない。

Python3の整数int型

Python3のint型はPython2のlong型に相当し、最大値・最小値の制限はない。

整数の上限がなくなったため、sys.maxint 定数は削除されました。しかしながら、通常のリストや文字列の添え字よりも大きい整数として sys.maxsize を使うことができます。 sys.maxsize は実装の "自然な" 整数の大きさに一致し、同じプラットフォームでは (同じビルドオプションなら) 過去のリリースの sys.maxint と普通は同じです。
What's New In Python 3.0 - 整数 — Python 3.12.0 ドキュメント

それに伴いsys.maxintは削除され、代わりにsys.maxsizeが追加された。

sys.maxsizeはPython2でのsys.maxintと同じく、32bit環境では2**31-1、64bit環境では2**63-1となる。

import sys

print(sys.maxsize)
# 9223372036854775807

print(type(sys.maxsize))
# <class 'int'>

print(sys.maxsize == 2**63 - 1)
# True

bin(), hex()で2進数および16進数の文字列に変換すると以下の通り。

print(bin(sys.maxsize))
# 0b111111111111111111111111111111111111111111111111111111111111111

print(hex(sys.maxsize))
# 0x7fffffffffffffff

sys.maxsizeint型の最大値(上限)ではなく、メモリの許す限りさらに大きな値を扱うことが可能。

i = 10**100

print(i)
# 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

print(i > sys.maxsize)
# True

浮動小数点数float型との関係

浮動小数点数float型のとりうる最大値はsys.float_info.maxで取得できる。

print(sys.float_info.max)
# 1.7976931348623157e+308

int型には上限がないため、float型の最大値を超える値を扱うことができる。

i_e309 = 10**309

print(type(i_e309))
# <class 'int'>

print(i_e309 > sys.float_info.max)
# True

なお、float型には特殊な値として無限大を表すinfがある。無限大infは他のどの数値よりも大きいと判定される。

print(float('inf'))
# inf

print(float('inf') > sys.float_info.max)
# True

print(float('inf') > i_e309)
# True

infint型に変換しようとするとエラーOverflowErrorになるので注意。

# int(float('inf'))
# OverflowError: cannot convert float infinity to integer

無限大infについては以下の記事を参照。

整数・文字列変換の桁数制限

2022年9月7日以降に公開されたバージョン(Python 3.11, 3.10.7, 3.9.14, 3.8.14, 3.7.14以降)では、整数と文字列の変換がデフォルトで4300桁までに制限されるようになった。

整数・文字列変換アルゴリズムがO(n^2)であることを利用したDoS攻撃を防ぐのが目的。

あくまでも整数・文字列変換が制限されるだけで、int型自体は4300桁より大きい値を保持できる。文字列への変換以外の処理は従来通り可能。

print()repr()のように内部で整数を文字列に変換する処理でもエラーになるので注意。

i = 10**10000
# print(i)
# ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit

int()str()での例や、制限桁数の設定方法など、詳細は以下の記事を参照。

関連カテゴリー

関連記事