言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

C言語辞典

  1. トップページ
  2. C言語辞典
  3. log() / log2() / log10() / exp()

log() / log2() / log10() / exp()

対応: C99(1999)

対数関数と指数関数です。『<math.h>』に定義されており、情報理論・信号処理・科学計算など幅広い場面で使われます。コンパイル時に『-lm』リンクオプションが必要な場合があります。

構文

// 自然対数(底 e)を返します(x > 0 が必要です)。
double log(double x);

// 2を底とする対数を返します(x > 0 が必要です。C99以降)。
double log2(double x);

// 10を底とする常用対数を返します(x > 0 が必要です)。
double log10(double x);

// e(ネイピア数)の x 乗を返します(e ≈ 2.71828)。
double exp(double x);

// 2 の x 乗を返します(C99以降)。
double exp2(double x);

// e^x - 1 を精度よく計算します(x が 0 に近いときに有効。C99以降)。
double expm1(double x);

関数一覧

関数概要
log()自然対数(ln x)を返します。log(M_E) → 1.0
log2()2を底とする対数を返します。log2(8.0) → 3.0
log10()常用対数(log₁₀ x)を返します。log10(1000.0) → 3.0
exp()e の x 乗(指数関数)を返します。exp(1.0) → 2.71828...
exp2()2 の x 乗を返します。exp2(10.0) → 1024.0
expm1()e^x - 1 を精度よく計算します。expm1(0.0001) ≈ 0.00010001

サンプルコード

sample_log_log2_log10_exp.c
#include <stdio.h>
#include <math.h>

int main(void) {
    // log で自然対数を求めます。
    printf("log(1.0) = %.6f\n", log(1.0)); // ln(1) = 0 が出力されます。
    printf("log(M_E) = %.6f\n", log(M_E)); // ln(e) = 1 が出力されます。
    printf("log(10.0) = %.6f\n", log(10.0)); // 2.302585... が出力されます。

    // log2 でビット数の計算(2の何乗かを調べます)。
    printf("log2(8.0) = %.1f\n", log2(8.0)); // 『3.0』と出力されます。
    printf("log2(1024.0) = %.1f\n", log2(1024.0)); // 『10.0』と出力されます。

    // log10 で桁数の計算(10の何乗かを調べます)。
    printf("log10(100.0) = %.1f\n", log10(100.0)); // 『2.0』と出力されます。
    printf("log10(1000.0) = %.1f\n", log10(1000.0)); // 『3.0』と出力されます。

    // 任意の底 b の対数は log(x)/log(b) で計算します。
    double x = 27.0, base = 3.0;
    double log_base3 = log(x) / log(base);
    printf("log3(27) = %.6f\n", log_base3); // 『3.000000』と出力されます。

    // exp で指数関数を計算します(複利計算の例)。
    double r = 0.05; // 年利 5%
    double t = 10.0; // 10年
    double growth = exp(r * t); // 連続複利の成長倍率
    printf("10年後の倍率: %.4f 倍\n", growth); // 約 1.6487 倍が出力されます。

    // exp と log は互いに逆関数です。
    double val = 3.0;
    printf("exp(log(3.0)) = %.6f\n", exp(log(val))); // 『3.000000』と出力されます。

    return 0;
}

コンパイルして実行すると次のようになります。

gcc log_log2_log10_exp.c -o log_log2_log10_exp -lm
./log_log2_log10_exp
log(1.0) = 0.000000
log(M_E) = 1.000000
log(10.0) = 2.302585
log2(8.0) = 3.0
log2(1024.0) = 10.0
log10(100.0) = 2.0
log10(1000.0) = 3.0
log3(27) = 3.000000
10年後の倍率: 1.6487 倍
exp(log(3.0)) = 3.000000

デシベル変換(信号処理への応用)

音響・通信分野ではデシベル(dB)表現が使われます。電力比のデシベル変換には log10() を使います。

log_decibel.c
#include <stdio.h>
#include <math.h>

int main(void) {
    double power_ratios[] = {0.001, 0.1, 1.0, 10.0, 1000.0};
    int n = (int)(sizeof(power_ratios) / sizeof(power_ratios[0]));

    printf("%-12s %s\n", "電力比", "dB");
    for (int i = 0; i < n; i++) {
        double db = 10.0 * log10(power_ratios[i]);
        printf("%-12.3f %.1f dB\n", power_ratios[i], db);
    }
    return 0;
}

コンパイルして実行すると次のようになります。

gcc log_decibel.c -o log_decibel -lm
./log_decibel
電力比         dB
0.001        -30.0 dB
0.100        -10.0 dB
1.000        0.0 dB
10.000       10.0 dB
1000.000     30.0 dB

よくあるミス

よくあるミス: 0 以下の値を渡す

log()・log2()・log10() に 0 または負の値を渡すと定義域外エラーになり、-HUGE_VAL や NaN が返ります。使用前に値の範囲を確認します。

log_domain_ng.c
#include <stdio.h>
#include <math.h>

int main(void) {
    /* NG: 0 や負の値を渡すと -inf や NaN になる */
    printf("log(0.0) = %f\n", log(0.0)); /* -inf */
    printf("log(-1.0) = %f\n", log(-1.0)); /* nan */
    return 0;
}

修正後は次の通りです。

gcc log_domain_ng.c -o log_domain_ng -lm
./log_domain_ng
log(0.0) = -inf
log(-1.0) = -nan
log_domain_ok.c
#include <stdio.h>
#include <math.h>

int main(void) {
    double values[] = {-1.0, 0.0, 0.5, 1.0, 100.0};
    int n = (int)(sizeof(values) / sizeof(values[0]));

    for (int i = 0; i < n; i++) {
        if (values[i] <= 0.0) {
            printf("log(%.1f) = 定義域外\n", values[i]);
        } else {
            printf("log(%.1f) = %.6f\n", values[i], log(values[i]));
        }
    }
    return 0;
}

修正後は次の通りです。

gcc log_domain_ok.c -o log_domain_ok -lm
./log_domain_ok
log(-1.0) = 定義域外
log(0.0) = 定義域外
log(0.5) = -0.693147
log(1.0) = 0.000000
log(100.0) = 4.605170

概要

C言語の『log()』は自然対数(底 e)です。数学の「log」が常用対数(底 10)を指す場合と異なるため注意が必要です。任意の底 b に対する対数を計算するには、底の変換公式『log_b(x) = log(x) / log(b)』を使います。

log()・log2()・log10() の引数に 0 以下の値を渡すと、それぞれ -HUGE_VAL(負の無限大相当)や NaN が返ります。引数が正であることを事前に確認してください。

『expm1()』は x が 0 に非常に近い場合に『exp(x) - 1』より精度よく計算できます。金融計算など、x が微小な場合の精度が重要な場面で使用してください。

べき乗(pow)や平方根については『sqrt() / pow()』、三角関数については『sin() / cos() / tan()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。