[Python中級講座] 数値型(int, float,complex)の計算

今回は整数型(int型)浮動小数点(float型)複素数型(complex型)の計算方法について解説します。

数値を扱うデータ型の詳細と具体的な使用例を確認していきましょう。

数値を扱うデータ型

Pythonには数値を扱うデータ型として以下の型が存在します。

データ型(数値)意味
int整数-1, 0, 1
float浮動小数点(小数を含む)-1.5, 0.0, 3.1
complex複素数1+2j

整数型(int型)とは「…,-1, 0, 1,…」などの整数を表すデータ型です。

一方、浮動小数点(float型)では小数を含む数値を表すことができます。
また、「e」を用いた指数表現があります。

複素数型(complex型)では複素数を表すことができます。
数学で虚数単位はiと表記しますが、工学系の分野では電流の記号でiを用いるため、虚数単位をjで表します。
情報系の学問でも虚数単位にjを用いることが多いです。

指数表現(指数表記)について

指数表現とは大きすぎる数値(もしくは小さすぎる数値)を簡単に記述する方法です。

「e」は10のべき乗を表しています。

 例えば、20万という値を記述したいときに「200000」と書くと桁が分かりにくいです。
そこで「e」を用いて2.0e5と記述すると桁数が一目でわかります。

a = 200000
b = 2e5

print(a)    #出力例:200000
print(b)    #出力例:200000.0

上記のコードではどちらの表現も20万を表しています。

数値の計算方法

数値計算で用いる算術演算子

まずは数値の計算で用いる算術演算子を確認しましょう。

演算子説明
a + b足し算
a – b引き算
a * bかけ算
a / b割り算
a // b割り算(小数点以下切り捨て)
a % b剰余計算(余りを取得)

これらの演算子は一部の組み合わせを除き、異なる数値型同士でも計算することができます。

演算例

整数(int型)同士の計算例

整数型同士の計算の出力値は基本的に整数型(int型)となります。
ただし、割り算では出力される数値の型が浮動小数点(float型)となります。

print(2 + 2)     #出力例:4
print(2 - 2)     #出力例:0
print(2 * 2)     #出力例:4
print(2 / 2)     #出力例:1.0
print(5 // 2)    #出力例:2
print(5 % 2)     #出力例:1

浮動小数点(float型)同士の計算例

浮動小数点(float型)同士の計算の出力値は基本的に浮動小数点(float型)となります。

print(2.1 + 2.1)     #出力例:4.2
print(2.1 - 2.1)     #出力例:0.0
print(2.1 * 2.1)     #出力例:4.41
print(2.1 / 2.1)     #出力例:1.0
print(5.1 // 2.1)    #出力例:2.0
print(5.1 % 2.1)     #出力例:0.8999999999999995

複素数型(complex型)同士の計算

複素数型(complex型)小数点以下切り捨て「//」と剰余(あまり)「%」を計算することができません。

a = 1 + 1j
b = 2 + 2j

print(a + b)     #出力例:(3+3j)
print(a - b)     #出力例:(-1-1j)
print(a * b)     #出力例:4j
print(a / b)     #出力例:(0.5+0j)
print(a // b)    #出力例:TypeError
print(a % b)     #出力例:TypeError

整数(int型)と浮動小数点(float型)の計算

整数(int型)と浮動小数点(float型)の計算では出力値がすべて浮動小数点(float型)となります。

print(2 + 2.0)     #出力例:4.0
print(2 - 2.0)     #出力例:0.0
print(2 * 2.0)     #出力例:4.0
print(2 / 2.0)     #出力例:1.0
print(5 // 2.0)    #出力例:2.0
print(5 % 2.0)     #出力例:1.0

複素数型(complex型)と他の型(int,float)の計算

複素数型(complex型)同士の計算同様、小数点以下切り捨て「//」と剰余(あまり)「%」を計算することができません。

a = 1 + 1j
b = 2

print(a + b)     #出力例:(3+1j)
print(a - b)     #出力例:(-1+1j)
print(a * b)     #出力例:(2+2j)
print(a / b)     #出力例:(0.5+0.5j)
print(a // b)    #出力例:TypeError
print(a % b)     #出力例:TypeError

浮動小数点(float型)の注意点

Pythonでは計算を2進数で行っています。
そのため、浮動小数点(float型)の数値を含む演算は誤差が生じる場合があります。

10進数の数値を2進数に変換すると循環小数になる場合があります。
この循環小数は無限に桁が続くのですが、メモリは有限のため、どこかの桁で止める必要があります。
そのため誤差が生じます。

例えば0.1は内部で2進数に変換して計算を行い、10進数に戻して我々に表示されます。
しかし、0.1は循環小数のため、2進数に変換したあとに、10進数に戻すと0.1000000000000000055111…と0.1の近似値が返されます。

誤差の例

以下は0.1*0.1が0.01かどうかを判定するプログラムです。

if 0.1 * 0.1 == 0.01:
  print("真")
else:
  print("偽")
  print(0.1*0.1)

"""
出力例:
偽
0.010000000000000002
"""

0.1*0.1は0.01なので出力は「真」となるはずですが、実際は「偽」が出力されました。

0.1*0.1の出力を見てみると0.010000000000000002と誤差が生じていることが確認できます。

対策

pythonには10進数で浮動小数点数を表現するDecimal型が存在します。

以下のようにdecimal型をインポートすると、10進数の浮動小数点数の計算を行うことができます。

import decimal

a = decimal.Decimal('0.1')
b = decimal.Decimal('0.01')

if a * a == b:
  print("真")
  print(a * a)
else:
  print("偽")
  print(0.1*0.1)

"""
出力例:
真
0.01
"""

モジュールについては以下の記事で解説しています。

[Python中級講座]ライブラリとモジュールについて
今回はPythonのライブラリとモジュールについて解説します。モジュールとはモジュールとは機能ごとにまとめられた関数やクラスが記述されたプログラムファイルのことです。ライブラリとはライブラリとはpythonの命令をまとめてパッケージ化したも...

まとめ

今回は整数型(int型)浮動小数点(float型)複素数型(complex型)の計算方法について解説しました。

Pyhonの数値計算は基本的に型を意識しなくても使えてしまいますが、誤差などの不都合が生じる場合もあるので型を意識してプログラミングしましょう。