Pythonで取り扱うことができる整数の最大値

Pythonではどんなに大きな整数でも扱うことができる

「実践力を身につけるPythonの教科書」で、2の500乗を求める計算が紹介されていました。やってみると、紙と鉛筆でやれば一生かかるよう計算をPythonは図のとおりたちどころにやってのけます。

print(2 ** 500)
3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376

そこで、Pythonでは、いったいどれくらいの桁数の整数を扱うことができるのか調べてみました。結論からいうと、マシンの性能が許す範囲であれば、どんなに大きな整数でも扱うことができるようです。

Pythonの3系ではsysモジュールにmaxsizeという組み込み変数があり、Py_ssize_t′^の変数が取りうる最大値を示してくれます。Py_ssize_tのssizeとはSequencesizeの略で、リストなどの要素の数をもののようですが、よくわからないので後で調べてみようと思います。

#maxsize変数でy_ssize_t変数が取りうる最大値を求める
import sys
import math

x = sys.maxsize
print(x)
print(math.log2(x + 1))
2147483647
31.0

Windows32ビットOSでは2,147,483,647(2の31乗‐1)になります。これに対し、64ビットOSの場合は次のようになります。

9223372036854775807
63.0

64ビットなのに1桁少ない63乗というのは、プラスとマイナスがあるためだと思われます。それでも19桁というのは922京3372兆・・・という数字だけでもとんでもないことになります。しかし、これはあくまでもリストの要素数などの話なので、通常の計算であれば、前に紹介した通り、さらに大きな数字が扱えるというわけです。

エクセルとの比較

それでは我々がいつもお世話になっているエクセルではどうでしょうか?

マイクロソフトのホームページによると、有効桁数は10の15乗と書かれています。

セルA1に14桁で1番大きな数字999兆9999億9999万9999-1を入力し、列幅を広げた上で整数表示にします。これに対し、数字を1ずつ足し算していくと、おかしなことが起こります。

Excelで表示できる整数の最大値

セルA3の1000兆ぴったりまでは良いのですが、それに1を加えても1000兆とおなじ数字が表示されます。そして1000兆6になった時点で1000兆10となり、整数部分を勝手に四捨五入してしまいます。(細かいことをいうと下1桁が5のときは切り下がっているので、JIS丸めによっているものと思います。)おそらく我が国の事務処理の分野で1000兆円を超える数字を扱うのは、財務省で国債の残高を管理している部門くらいだと思います。このような意味ではエクセルでも十分のような気がしますが、次のような計算をすると、下1桁は一目で1と分かるのに、計算結果の下1桁は0と明らかにおかしなことになります。

Excelでの面白い整数の計算

その点Pythonはいくらでも計算してくれます。

#print(111 * 111)
print(1111 * 1111)
print(11111 * 11111)
print(111111 * 111111)
print(1111111 * 1111111)
print(11111111 * 11111111)
print(111111111 * 111111111)
print(1111111111 * 1111111111)
print(11111111111 * 11111111111)
print(111111111111 * 111111111111)
12321
1234321
123454321
12345654321
1234567654321
123456787654321
12345678987654321
1234567900987654321
123456790120987654321
12345679012320987654321

この計算、8行より後はあまり面白い結果は出ませんが、Pythonの地味にすごいところを示してくれています。