Python math.log10()とは?常用対数を計算する方法を解説
Pythonのmath.log10()は、常用対数(底が10の対数)を計算する関数です。
「10を何乗すればその数になるか」を求めます。桁数の計算や、デシベル・pHといった対数スケールの処理で使われます。
この記事では、math.log10()の使い方と実践例を解説します。
math.log10()の基本的な使い方
import math
print(math.log10(100))
print(math.log10(1000))
print(math.log10(1))
print(math.log10(0.01))
実行結果:
2.0
3.0
0.0
-2.0
10² = 100なので、log10(100)は2です。
| 入力 | 結果 | 意味 |
|---|---|---|
| 1 | 0 | 10⁰ = 1 |
| 10 | 1 | 10¹ = 10 |
| 100 | 2 | 10² = 100 |
| 0.1 | -1 | 10⁻¹ = 0.1 |
log(x, 10)より精度が高い
math.log()に底を指定しても常用対数は計算できますが、結果が微妙に異なります。
import math
print(math.log10(1000))
print(math.log(1000, 10))
実行結果:
3.0
2.9999999999999996
math.log(x, 10)は内部でlog(x) / log(10)という割り算をするため、誤差が生じます。
一方math.log10()は専用のアルゴリズムで計算するため、より正確です。
この差は、整数化するときに問題になります。
import math
print(int(math.log10(1000)))
print(int(math.log(1000, 10)))
実行結果:
3
2
桁数の計算で1桁ずれるという、発見しにくいバグの原因になります。常用対数を求めるなら、必ずmath.log10()を使ってください。
同様に、底が2ならmath.log2()が用意されています。
import math
print(math.log2(1024))
print(math.log(1024, 2))
0以下を渡すとエラー
import math
math.log10(0)
実行結果:
ValueError: math domain error
import math
math.log10(-100)
実行結果:
ValueError: math domain error
対数は正の数にしか定義されていません。0や負の数が入りうるデータでは、事前に確認します。
import math
def safe_log10(x):
return math.log10(x) if x > 0 else None
for v in [100, 0, -5]:
print(v, "→", safe_log10(v))
実行結果:
100 → 2.0
0 → None
-5 → None
実践例|桁数を求める
import math
def digits(n):
if n == 0:
return 1
return int(math.log10(abs(n))) + 1
for n in [5, 42, 999, 1000, 123456]:
print(f"{n:>7} → {digits(n)}桁")
実行結果:
5 → 1桁
42 → 2桁
999 → 3桁
1000 → 4桁
123456 → 6桁
len(str(n))でも求められますが、巨大な数では対数のほうが高速です。文字列への変換が不要なためです。
import math
import timeit
n = 10 ** 10000
print(timeit.timeit(lambda: len(str(n)), number=100))
print(timeit.timeit(lambda: int(math.log10(n)) + 1, number=100))
ただし、非常に大きな数では浮動小数点の精度限界に達するため、厳密さが必要ならlen(str(n))を使ってください。
実践例|デシベルの計算
音の大きさや信号の強さは、対数スケールで表されます。
import math
def to_db(power, reference=1.0):
return 10 * math.log10(power / reference)
for p in [1, 2, 10, 100, 1000]:
print(f"{p:>5}倍 → {to_db(p):>6.1f} dB")
実行結果:
1倍 → 0.0 dB
2倍 → 3.0 dB
10倍 → 10.0 dB
100倍 → 20.0 dB
1000倍 → 30.0 dB
2倍で約3dB、10倍で10dBという関係が確認できます。人間の感覚が対数的であるため、この表現が使われます。
実践例|pHの計算
import math
def ph(concentration):
return -math.log10(concentration)
for c in [1e-7, 1e-3, 1e-11]:
print(f"濃度 {c:.0e} → pH {ph(c):.1f}")
実行結果:
濃度 1e-07 → pH 7.0
濃度 1e-03 → pH 3.0
濃度 1e-11 → pH 11.0
水素イオン濃度の対数にマイナスを付けたものがpHです。
実践例|対数スケールで表示する
import math
data = {"A": 100, "B": 5000, "C": 1000000}
for name, value in data.items():
scale = int(math.log10(value) * 5)
print(f"{name} {value:>9,} {'■' * scale}")
実行結果:
A 100 ■■■■■■■■■■
B 5,000 ■■■■■■■■■■■■■■■■■■
C 1,000,000 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
値の差が1万倍あっても、1つの画面に収まる形で比較できます。アクセス数やファイルサイズなど、桁の違うデータを並べるときに有効です。
関連する対数関数
| 関数 | 底 | 主な用途 |
|---|---|---|
math.log10(x) |
10 | 桁数・デシベル・pH |
math.log2(x) |
2 | ビット数・計算量 |
math.log(x) |
e(自然対数) | 数学・統計 |
math.log(x, base) |
任意 | その他の底 |
math.log1p(x) |
e | log(1+x)を高精度に |
import math
print(math.log2(1024))
print(math.log(math.e))
print(math.log(8, 2))
log1p()は、xが極小のときに精度を保つための関数です。
import math
x = 1e-16
print(math.log(1 + x))
print(math.log1p(x))
実行結果:
0.0
1e-16
1 + xの時点で情報が失われるため、上は0になってしまいます。
math.log10()まとめ
| ポイント | 内容 |
|---|---|
| 構文 | math.log10(x) |
| 意味 | 10を何乗すればxになるか |
| 定義域 | 正の数のみ(0以下はエラー) |
log(x, 10)との違い |
log10のほうが正確 |
| 桁数の計算 | int(log10(n)) + 1 |
| 底が2 | math.log2() |
「log(x, 10)ではなくlog10(x)」——この使い分けが、桁数計算のずれを防ぐ決め手になります。







