sec01 - math(数学関数)

数学関数

Pythonには、標準で"数学関数"が用意されています。数値に対する各種演算や、sin, cosのような三角関数も用意されています。このレクチャーでは、使う頻度が高そうなものを中心に紹介します。

皆さんの中には、数学が苦手という方もいらっしゃるかもしれませんが、ここでは、(1)『Pythonには数学関数というものが用意されていること』と、(2)『主な関数の使用例』が確認できれば大丈夫ですので、気楽に受講してください。(数学関数を使う機会のないプログラマーも沢山いますから、ここで紹介するものを全て覚える必要はありません。)

ここで紹介しきれない関数もありますので、用意されている全ての関数を確認したい場合は、公式ドキュメントも併せてご確認ください。

https://docs.python.org/ja/3.13/library/math.html

ceil, floor

まずは、ceil関数とfloor関数を学習します。

ceilは"Ceiling"の略で、"天井"という意味になります。これは、浮動小数点数を整数に変換する際に、必ず"切り上げ"で整数を返します。floorは"床"という意味で、浮動小数点数を整数に変換する際に、必ず"切り捨て"で整数を返します。ceilfloorも、roundのように桁指定はできません。

それでは、次のコードを実行してみましょう。ceilは5.5を切り上げるので"6"が返され、floorは5.5を切り捨てるので"5"が返されます。

import math

result_ceil1 = math.ceil(5.5)  # Ceiling
result_floor1 = math.floor(5.5)  # Floor
print(result_ceil1)  # 6
print(result_floor1)  # 5

コードの解説ですが、数学関数を使用する時は"import math"という1行を記述して、"mathモジュール"の"インポート(読み込み)"が必要になります。これは、Pythonに対して『これから数学関数の詰め込みセットを使うので、読み込んでおいてください』と宣言するものです。

(モジュールimportに関しては専用のレクチャーで詳しく説明しますので、今は数学関数の"詰め込みセット(モジュール)"を"インポート(読み込む)"するように宣言する必要があるんだな、くらいの理解で大丈夫です。)

そして、各関数を使用する時はmath.関数名()のように、モジュール名と関数名をドット(.)で繋げて記述します。これは、Pythonに対して『数学関数の詰め込みセット(math)の中のceil関数を使用します』と宣言しているようなものです。

上記コードの他の部分はこれまで学習してきた内容と同じで、関数の丸カッコ内に処理させたい数値を入力し、その処理の結果を変数に代入します。そして、最後にprint出力します。

次に、ceilfloorに対して、マイナスの浮動小数点数を渡します。

import math

result_ceil2 = math.ceil(-5.5)  # Ceiling
result_floor2 = math.floor(-5.5)  # Floor
print(result_ceil2)  # -5
print(result_floor2)  # -6

ceilfloorはマイナスの値であっても、切り上げ/切り捨ては同様に動作します。"math.ceil(-5.5)"は切り上げで"-5"を返し、"math.floor(-5.5)"は切り捨てて"-6"を返します。

modf

modf関数は、数値の整数部分と小数部分を分離します。次のコードを実行してみましょう。

import math
result = math.modf(5.5)
print(result)  # (0.5, 5.0)

modfを実行すると、結果は"(小数部, 整数部)"のように、丸カッコで囲われた形で数値が返されます。このように、丸カッコで複数の値を保持するデータ型のことをPythonでは"tuple(タプル)"と呼びます。modfの丸カッコ内に"5.5"を指定すると、小数部の"0.5"と整数部の"5.0"に分離され、"(0.5, 5.0)"のように結果が返ってきます。

(tupleについては、専用のレクチャーで詳しく学習しますので、ここでは複数の数値の情報が返されるんだなと思っておいてください。)

もし、変数を小数部用整数部用に分けて、それぞれ異なる変数に代入したい場合は、次のように書くこともできます。

import math
d, i = math.modf(5.5)    # (0.5, 5.0)
print("decimal:", d)  # 小数部
print("integer:", i)  # 整数部

先ほどのコードと違う部分は、result変数への代入部分がd, i =のように、2つの変数に代入される形に書き換えられているところです。これは、先ほどのtuple("(0.5, 5.0)")の形で返ってきたそれぞれの値を、左から順番にそれぞれの変数に分けて代入するための書式です。今回の場合は、変数"d"に"0.5"が、変数"i"に"5.0"が代入されます。

fabs, copysign

fabsは絶対値を返す関数です。"f"はfloatの略で"abs"はabsolute(絶対)の略です。floatにも対応した、絶対値を返す関数になります。丸カッコに絶対値を求めたい数値を入力します。(入力する値は整数でも問題ありません。)

copysignは、""と"符号"を丸カッコ内で指定します。『"値"の絶対値に対し、"符号"をコピーする』という挙動になります。

コードを実行し、挙動を確認しましょう。

import math
result_fabs = math.fabs(-5.5)  # absolute
result_copysign = math.copysign(-5.5, -0.0)
print(result_fabs)  # 5.5
print(result_copysign)  # -5.5

"math.fabs(-5.5)"を実行すると絶対値の"5.5"が返ってきます。

"math.copysign(-5.5, -0.0)"は、"-5.5"の絶対値("5.5")に"-0.0"の符号(マイナス)をコピーするので、結果は"-5.5"になります。(マイナスの符号を指定したい場合は"-0.0"のように書きます。) "math.copysign(-5.5, 0.0)"と記述した場合は、"-5.5"の絶対値("5.5")に"0.0"の符号(明示されていませんが、プラス)をコピーするので、結果は"5.5"になります。

常に絶対値の正の値を返して欲しい場合は"fabs"を使用し、状況次第で符号が変化するような場合は"copysign"を利用するのが良いでしょう。

pi, sin, cos

数学関数には"定数"が用意されています。定数とは、予め定められた値で変化しないもののことを言います。例えば、Pythonの数学関数では、円周率pi(π 3.1415...)が用意されています。

次のようにコードを書いて、定数piの値を確認します。

import math

print(math.pi)  # 3.141592653589793

"math.pi"と書くことで、定数の値を使うことができます。(定数を参照す時は、関数と違って丸カッコは必要ありません。) これをprint出力すると、"3.141592653589793"という値が定められていることが確認できます。このような定数を利用することで、プログラマーは"pi = 3.141592653589793"のようなコードをわざわざ書く必要がなくなります。

では、"math.pi"の利用例を見てみましょう。数学関数にはsincosが用意されているので、次のコードを記述して実行してみましょう。

import math

result_sin = math.sin(math.pi / 2)  # Sine
result_cos = math.cos(math.pi)  # Cosine
print(result_sin)  # 1.0
print(result_cos)  # -1.0

"math.sin(math.pi / 2)"は、"math.sin(3.1415... / 2)"を計算しているのと同じ意味合いになり、結果は"1.0"になります。"math.cos(math.pi)"は、"math.cos(3.1415...)"を計算しているのと同じ意味合いになり、結果は"-1.0"になります。