pythonで対数を取る関数math.log()の使い方と、対数自体の概念のおさらいです。
特に対数は久しぶりに使うとなんの事だったか忘れてしまうので、順を追って分かりやすく説明しています。
対数を取る
pythonで対数の計算を行いたいときはmath.log()関数を使います。
math.log()関数を使うためには「import math」でパッケージのインポートが必要です
下記の例では、10を底にしたときに100の対数が何かを求めており、実行すると2.0が出力されます。
import math
print(math.log(100, 10))
# [出力]
# 2.0
このようにpythonのmath.log()関数では、第一引数へ求めたい数を指定し、第二引数に底を指定します。
対数の底とは何か?
log計算というのは、ざっくりいうと桁数を求める行為です。
10を底にした場合は、入力が10倍になるごとに戻り値は+1されていく仕組みです。
import math
print(math.log(1, 10))
print(math.log(10, 10))
print(math.log(100, 10))
print(math.log(1000, 10))
# [出力]
# 0.0
# 1.0
# 2.0
# 2.9999999999999996
ここで、math.log(1000, 10)の出力が3ではなく2.999...になっていますが、これはlog()関数の性質ではなくpythonが小数点を近似値計算していることによる計算誤差が原因です。
pythonによる指数表現
ところで、pythonでは**
演算子というものがあり、これを使うことで以下のように指数計算が行えます。
指数計算というのは、例えば10の3乗
というのは10*10*10
と同じことを意味しており、乗数の部分でその数を何回掛けるかを指定します。人が大きな数字を説明するときに「1の後に0が10個続く大きな数字」といった表現を使うことがありますが、これと同じ考え方です。
import math
print(10 ** 0)
print(10 ** 1)
print(10 ** 2)
print(10 ** 3) # 10の3乗を求める
# [出力]
# 1
# 10
# 100
# 1000
logと指数の関係
先ほど説明した指数とlog()関数を組み合わせると、以下のように書くことができます
import math
print(math.log(10 ** 0, 10))
print(math.log(10 ** 1, 10))
print(math.log(10 ** 2, 10))
print(math.log(10 ** 3, 10))
# [出力]
# 0.0
# 1.0
# 2.0
# 2.9999999999999996
出力をみると、指数の部分の数字がそのまま結果に出ていることがわかります。
指数計算したものを対数計算すると元に戻るという関係で、これを難しくいうと「指数関数は対数関数の逆関数である」と言ったりもします。
自然対数を使う
数学には自然対数という(初めて聞く人にとっては)謎な数字があり、これはpythonではmath.eで取得できます。
import math
print(math.e)
# [出力]
# 2.718281828459045
自然対数は,上記の実行結果からもわかるように2.7ぐらいの値です
対数の底を10から自然対数(e)に変更してlog()計算する
これまでlog()の底を10にしていましたが、自然対数に変更してみます。
下記の結果は、これまでみてきた流れで推測できるかと思いますが、それぞれ0,1,2,3になります。
import math
print(math.log(math.e ** 0, math.e))
print(math.log(math.e ** 1, math.e))
print(math.log(math.e ** 2, math.e))
print(math.log(math.e ** 3, math.e))
# [出力]
# 0.0
# 1.0
# 2.0
# 2.9999999999999996
log()関数の第二引数を省略する
実は、pythonのlog関数は第二引数を省略することができ、省略した場合は自然対数を指定したとみなします。
このため、下記のプログラム1つ前の実験と同じ結果になります。
import math
print(math.log(math.e ** 0))
print(math.log(math.e ** 1))
print(math.log(math.e ** 2))
print(math.log(math.e ** 3))
# [出力]
# 0.0
# 1.0
# 2.0
# 2.9999999999999996
まとめ
これまで学んだことをまとめると、以下の通りです。
- pythonで対数を計算するには
import math
が必要 - pythonで対数はmagh.log()で計算できる
- 対数計算というのは、桁数を求める処理のようなもの
- 指数と対数はそれぞれ反対の関係になっている
- math.log()は第二引数を省略でき、省略時は自然対数が底と見なされる
最初の例示の出力結果についてlog(100,10)なので2.0じゃないですか?
コメントありがとうございます!
確かに間違っていましたので、記事の内容修正しました。