ここでは基本的な数字の型であるint型について述べます。javaなど他の言語をやってきた人にとってはint型というと基本型で単なる数値と思う人もいるかもしれません。この記事を読むとそうでないことがわかり、知らない人にちょっと話してみたくなるかもしれません。
pythonのint型
pythonでは整数をintで表します。他の言語であればintで表せる最大値があり、intを超える場合にはlong intやさらにはlong long intなどの型があることもあります。ですがpython(python3)のintには最大値がありません。メモリの許す限り大きな数を表すことができます。もちろんlong intなどは用いずどんなに大きな整数でもintです。分かりやすいですね。
アセンブラやC言語、javaなどからしたら許せないことかもしれませんが、常に最大値を気にしながらプログラムをする必要がないのは、ストレスレスで、とても良いことだとおもいます。
例えば以下のように巨大な数を扱ってもエラーになりません。
m=int('99999999999999999999999999999999999999999999999999999999999999')
n=m*m
print(n)
print(bin(n))
実行結果
9999999999999999999999999999999999999999999999999999999999999800000000000000000000000000000000000000000000000000000000000001 0b1111001000001001011110000111101110110100011111010110101110000100110000000110011110001100010111011011110100100011101001001001101000000110000100101100001111000101110011100001010111100101010101001101110011000100101001010100010100110001111000100111011011101010001011111010100100000101100011001011001111000100110100101100000100001010011011010110011010111000000000000000000000000000000000000000000000000000000000000001
実行結果の二行目のbit関数のbin(n)はnを2進数で表したものを表示します。64bitを超えた数(上の数だと412bit)を扱えているのがわかります(0b以降が412個ある)。
単なる数字とint型
言語によってはintは基本型といってクラスなどではなく実体は2進数の数値データだったりします。ですがpythonではint型オブジェクトという言葉が表す通りint型はオブジェクトでもあります。ですからメソッドも持っています。どのようなメソッドがあるかみてみます。
ちなみにpythonに評価される前の数字だけだと本当に単なる数字です。数字を変数などに代入したり()で囲うことで評価がおこなわれ単なる数字ではなくint型として扱われます。
bit_lengthメソッド
bit_lengthメソッドは数字を表すのに必要なビット長を返します。
print((4).bit_length())
実行結果
3
4は2進数で表すと100になります(bit関数)。つまり3bitで表すことができるため3が戻り値になっています。
4を括弧()で囲わないと以下のようにエラーとなります。
File "int-bit_length.py", line 1 print(4.bit_length()) ^ SyntaxError: invalid syntax
to_bytesメソッド
to_bytesメソッドは数字をバイト表現に直します。数字をバイトで表す際に数字の上位桁を小さいアドレスにいれるか、大きいアドレスにいれるかをバイトオーダといいます。バイトオーダには主なものとしてビックエンディアンとリトルエンディアンがあります。バイトオーダーは用いているCPU(実行プラットフォーム)によって異なります。そのためto_bytesで数字をバイト表現に直す場合にはバイトオーダーを指定する必要があります。
サンプル
import sys
bstr=(4).to_bytes(8,byteorder=sys.byteorder)
print(bstr)
ここでは4という数字をバイト(8×8=64bit)であらわそうとしています。バイトオーダーはsys.byteorderを指定しています。sys.byteorderは実行プラットフォーム上でのバイトオーダが入っています。
実行結果
b'\x04\x00\x00\x00\x00\x00\x00\x00'
4という数字を8バイトで表したときの表記が上記になります
as_integer_ratioメソッド
一応、as_integer_ratioメソッドも実装されています。これは数を整数比(分数)で近似するメソッドです。なぜ一応かというと、int型でこのメソッドを呼び出すと結果はかならず(元の数字, 1)になるからです。
import sys
iratio=(4).as_integer_ratio()
print(iratio)
実行結果
(4, 1)
このように4だと(4).as_integer_ratio()は(4,1)になります。4を分数で表すと4/1ですから当然です。(7).as_integer_ratio()は(7,1)になります。これも7=7/1ですから理解できるとおもいます。当たり前ですがnが整数のときには(n).as_integer_ratio()は(n,1)つまりn=n/1になります。
as_integer_ratioは通常、割り切れない数を整数比で表したり、小数を比で近似するときに使います。intとは関係ありませんが0.1だと以下のように近似されます。
iratio=(0.1).as_integer_ratio()
print(iratio)
実行結果
(3602879701896397, 36028797018963968)
(1,10)にならないのを不思議におもった方もいるかもしれません。(0.1)の段階でpythonは0.1を2進数の浮動小数点型に変換します。このとき誤差が生じるため誤差が生じた後にas_integer_ratioを使っても(1,10)になりません。
以下のようにDecimalにすると(1,10)になります。
from decimal import Decimal
iratio=Decimal('0.1').as_integer_ratio()
print(iratio)
実行結果
(1, 10)
まとめ
今回はint型オブジェクトについてみてみました。普段何気なく使っているintですがコンピューターの深い部分をかいま見せてくれる味わい深いオブジェクト型です。
Comment on this article
コメントはまだありません。
Send comments