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)」——この使い分けが、桁数計算のずれを防ぐ決め手になります。


あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら