section4
Python Programming: An Introduction to Computer Science
- 作者: John M. Zelle
- 出版社/メーカー: Franklin Beedle & Assoc
- 発売日: 2003/12
- メディア: ペーパーバック
- 購入: 1人 クリック: 4回
- この商品を含むブログ (5件) を見る
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では最初の加法を計算した時点でエラーとなる。)
教訓:コンピュータの数字の表現方法は完璧ではない。