Enrich Human Knowledge

人類全体の知識向上を目指して

section4

 

Python Programming: An Introduction to Computer Science

Python Programming: An Introduction to Computer Science

 

 

3.4 The Limits of Int

 

 OverflowError→古いバージョンのpythonで大きな数の階乗を計算しようとすると発生する。これはプログラムが整数型を用いて数を表していることによる。整数型は扱える大きさが決まっているのだ。より正確に言うと、固定された大きさの2進表現でコンピュータ内に保存されている。

 

 コンピュータのメモリは電気的な「スイッチ」からなり、それらは2つの状態、通常はオンとオフを取ることができる。それぞれのスイッチは2進数字、あるいは情報のビット(bit)を表す。1つのビットは普通0,1で表される可能性として符号化(encode)される。ビットの列を考えることで、より多くの可能性を表すことができる。

 

 nビットあれば、\( 2^n \)の可能性を表現することが可能である。(n個のスイッチのオン、オフにそれぞれ1つの可能性を対応させる。)

 

 特定のコンピュータが整数型を何ビットで表現しているかというのは、CPUのデザインに依存して決まる。典型的なPCでは32ビットである。32ビットの場合、正負の整数を表すために、整数型のレンジは\( -2^{31} \) ~ \( 2^{31} -1 \)となる。(-1は0を含めていることから来る。)

 

 それでは実際に\( 2^{31} - 1 \)を表示させることが可能かどうか計算させると、これもエラーとなる。それはこの式を計算する時に、まず\( 2^{31} \)が計算されてエラーとなってしまうからである。したがってもう少し上手い方法を用いなければならない。要するに途中のどの計算結果でもオーバーフローエラーを起こさないように工夫する。具体的には

 

 2 ** 30 -1 + 2 **30

 

とすれば良い。(真ん中に-1があるのにはちゃんとわけがって、恐らく2 ** 30 + 2 ** 30 -1では最初の加法を計算した時点でエラーとなる。)

 

 教訓:コンピュータの数字の表現方法は完璧ではない。