データのスケーリングや情報量の計算、物理学的な公式の実装において、対数(ロガリズム)の計算は欠かせません。
Pythonの標準ライブラリ math モジュールには、対数を計算するための関数として、汎用的な log() のほかに、底(base)があらかじめ決まっている log10() や log2() が用意されています。
この記事では、それぞれの関数の使い方と、用途に応じた使い分けについて解説します。
1. 任意の底を指定して計算する: math.log(x, base)
math.log() 関数は、第2引数に底(base)を指定することで、任意の底に対する対数 $\log_{base}(x)$ を計算します。
構文:
import math
結果 = math.log(真数, 底)
具体的な使用例
「3を何乗すれば81になるか($\log_3 81$)」を計算する例です。
import math
target_value = 81
base_value = 3
# log_3(81) を計算
result = math.log(target_value, base_value)
print(f"log{base_value}({target_value}) = {result}")
実行結果:
log3(81) = 4.0
答えは 4.0 となりました($3^4 = 81$)。戻り値は常に浮動小数点数(float)となります。
2. 自然対数(底が $e$)を計算する: math.log(x)
math.log() の第2引数(底)を省略すると、自動的に**ネイピア数 $e$(自然対数の底)**が底として使用されます。つまり、数学における $\ln(x)$ または $\log_e(x)$ を計算します。
import math
# ネイピア数 e 自体の対数をとると 1.0 になるはず
val = math.e
result_natural = math.log(val)
print(f"ln(e) = {result_natural}")
# 10 の自然対数
print(f"ln(10) = {math.log(10)}")
実行結果:
ln(e) = 1.0
ln(10) = 2.302585092994046
3. 常用対数(底が10)を計算する: math.log10(x)
底が10の対数(常用対数)を計算したい場合は、math.log(x, 10) と書くこともできますが、専用の math.log10(x) 関数を使う方が精度が高く、可読性も向上します。
具体的な使用例:デシベル (dB) の計算
信号の増幅率(ゲイン)などをデシベルで表現する際によく使われます。電力比が100倍の場合のデシベル値を計算します。
import math
# 入力電力に対する出力電力の比率(100倍)
power_ratio = 100
# デシベル計算: 10 * log10(比率)
decibel = 10 * math.log10(power_ratio)
print(f"電力比 {power_ratio}倍 は {decibel} dB です。")
実行結果:
電力比 100倍 は 20.0 dB です。
4. 底が2の対数を計算する: math.log2(x)
情報科学の分野で頻出する「底が2の対数」には、math.log2(x) を使用します。これは math.log(x, 2) よりも高精度です。
具体的な使用例:情報量のビット数
あるデータパターン数(状態数)を表現するために必要なビット数を計算する例です。
import math
# 表現したい状態の数(例: 256通りの色)
states = 256
# 必要なビット数を計算
bits_needed = math.log2(states)
print(f"{states}通りを表現するには {bits_needed} ビット必要です。")
実行結果:
256通りを表現するには 8.0 ビット必要です。
まとめ
math.log(x, base): 任意の底で対数を計算します。math.log(x): 底を省略すると自然対数(底 $e$)になります。math.log10(x): 常用対数(底 10)。デシベル計算や桁数の見積もりに適しています。math.log2(x): 二進対数(底 2)。情報量やビット数の計算に適しています。
用途に合わせて専用関数(log10, log2)を選ぶことで、コードの意図が伝わりやすくなります。
