Python3の整数int型に最大値はない(上限なし)
Python2の整数型にはint
とlong
の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.maxsize
はint
型の最大値(上限)ではなく、メモリの許す限りさらに大きな値を扱うことが可能。
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
inf
をint
型に変換しようとするとエラー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()
での例や、制限桁数の設定方法など、詳細は以下の記事を参照。