Pythonで対数関数(log)を計算する:math.log, log10, log2の使い方と使い分け

データのスケーリングや情報量の計算、物理学的な公式の実装において、対数(ロガリズム)の計算は欠かせません。

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)を選ぶことで、コードの意図が伝わりやすくなります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次