mathモジュールとcmathモジュール(その1)

この記事を読んでわかること

Pythonには,数学関数を扱うmathモジュールとcmathモジュールがある.mathモジュールとcmathモジュールの違いについて,主に型の違いに着目して説明する.モジュールで用意されている関数の細かな説明は今回は行わず,その2以降で行いたいと思う.

mathモジュールとcmathモジュールの違い

mathモジュールとcmathモジュールの違い(小数型と複素数型)

mathモジュールとcmathモジュールは,ともに数学関数を扱うモジュールではあるが,ひとつ決定的な違いがある.それは,cmathモジュールでは複素数が扱えることである.逆に言えば,mathモジュールでは複素数を扱えない.大きな違いとしてはこれだけである.では,最初からmathモジュールで複素数を扱えるようにしておけばいいのではと思うかもしれないが,複素数を扱えないことにも利点がある.

ひとつ例を見てみよう(小数型と複素数型)

例えば,次のような例を考えよう.

import cmath

x = int(input("x >> "))

cexp = cmath.exp(x)    # ネイピア数eのx乗
csin = cmath.sin(x)    # xの正弦

print(f'e^x >> {cexp}')
print(f'sin(x) >> {csin}')

print(max(cexp, csin))    # cexpとcsinの2つの値のうち大きい方の値を表示する

この例でやりたいことは,eのx乗の値とxの正弦の値を比較することである.ところがxになんらかの値を入れてみると次のようなエラーが出る.

x >> 1
e^x >> (2.718281828459045+0j)
sin(x) >> (0.8414709848078965+0j)
Traceback (most recent call last):
  File "c:\Users\user\Documents\py\0001.py", line 11, in <module>
    print(max(cexp, csin))    # cexpとcsinの2つの値のうち大きい方を表示する
          ^^^^^^^^^^^^^^^
TypeError: '>' not supported between instances of 'complex' and 'complex'

エラーは最後の1行に書いてあるのだが,要は「複素数型の比較はできない」ということである.cexpとcsinはそれぞれ2行目と3行目にみればわかるように,計算値自体はいずれも小数値である,+0jを除いて.小数型と複素数型の違いはここで,0jという複素数がついてしまっているのである.「複素数を考えていたらたまたま虚部が0になった」というだけである.複素数間には一般の不等式による大小関係は成り立たないので,この例ではダメということである.

ではどうすればよかったのか?(小数型と複素数型)

前の例では複素数型で出力されることによってエラーが起きていた.では,出力が複素数型でない関数を使えばよいのである.そこで登場するのがmathモジュールなのである.次に前の例を修正したものを示す.

import math

x = int(input("x >> "))

exp = math.exp(x)    # ネイピア数eのx乗
sin = math.sin(x)    # xの正弦

print(f'e^x >> {exp}')
print(f'sin(x) >> {sin}')

print(max(exp, sin))    # cexpとcsinの2つの値のうち大きい方の値を表示する

赤太字で示したようにcmathをmathに書き変えればよい.基本的に同じ関数が両方のモジュールにある.もちろん複素数を扱うものはcmathにしかないが…….最後に出力を見て終わりましょう.

x >> 1
e^x >> 2.718281828459045
sin(x) >> 0.8414709848078965
2.718281828459045
タイトルとURLをコピーしました