【C言語】log・log2・log10 関数で対数を求める

C言語での対数の求め方の解説ページアイキャッチ

このページでは、C言語での「対数の求め方」について解説していきます!

x が下記の式で表される時、p のことを「底を b とする x の対数」と呼びます。この対数 p を求めていきます!

$$ x = b ^ p $$

loglog2log10 関数

この対数は、C言語では loglog2log10 関数を利用することで求めることができます。

loglog2log10 関数の宣言

loglog2log10 関数は下記のように宣言されています。

log・log2・log10

#include <math.h>

double log(double x);
double log2(double x);
double log10(double x);

これらの関数を利用する際には math.h をインクルードする必要があります。

スポンサーリンク

loglog2log10 関数の返却値

これらの関数の返却値はそれぞれ下記のようになります。要は、それぞれ \( \log_e x \)・\( \log_2 x \)・\( \log_{10} x \) の計算結果を返却する関数ということです。

  • log:底を e とする x の対数(e はネイピア数)
  • log2:底を 2 とする x の対数
  • log10:底を 10 とする x の対数

例えば x256 である時、x2 の冪乗の形式で下記のように表すことができます。

$$ x = 2 ^ 8 $$

そのため、底を 2 とする x の対数は 8 ということになり、log2(x) においても返却値が 8.0 となります(返却値の型は double)。

loglog2log10 関数の引数の注意点

これらの関数は、要は引数 x に対し、下記の式が成立する際の p を求める関数です(底 b は前述の通り使用する関数によって異なります)

$$ x = b ^ p $$

そのため、基本的には引数 x には 0 でない “正の” 実数を指定することになります。

例えば x0 の場合、は下記の式が成立する p が関数の返却値になりますが、おそらく環境によって結果は異なるのではないかと思います。

$$ 0 = b ^ p $$

私の環境では -inf が返却されますが、環境によっては 0 が返却される場合もあるようです。なので、引数 x には 0 は指定しない方が無難だと思います。

また、loglog2log10 関数ともに底 b は正の値ですので、x が負の値の場合は下記が成立する実数 p は存在しません(正の値を何乗しても負の値にならない)。

$$ x = b ^ p $$

これも環境によって結果が異なる可能性がありますので、引数 x には負の値は指定しない方が無難だと思います(私の環境だと nan が返却されました)。

loglog2log10 関数の使用例

紹介するほどのものでもないかもしれませんが、次に loglog2log10 関数の使用例を紹介しておきます。

まず、下記は loglog2log10 関数において全て結果が 1.0 となる例になります。

log・log2・log10の使用例1

printf("%f\n", log(exp(1)));
printf("%f\n", log2(2));
printf("%f\n", log10(10));

exp 関数に関しては下記ページで紹介していますので、詳しく知りたい方は下記ページをご参照ください。

exp関数の使い方の解説ページアイキャッチ【C言語】exp 関数で「ネイピア数を扱う」&「e の x 乗を求める」

また、下記は x110 に変化させながら loglog2log10 関数それぞれの実行結果を表示する例になります。

log・log2・log10の使用例2

for (int x = 1; x <= 10; x++){
    printf("x:%f,%f,%f\n", x, log(x), log2(x), log10(x));
}

スポンサーリンク

他の底の対数を求める方法

loglog2log10 関数を利用することで、底が下記の場合の対数を求めることができるようになりましたね!

  • e
  • 2
  • 10

では、C言語では他の値を底とする対数は求められないのでしょうか?

当然可能です!

この「任意の値を底に指定して対数を求める方法」については別途下記ページで解説しておりますので、興味のある方はこちらをご参照いただければと思います。

底を指定して対数を求める方法の解説ページアイキャッチ【C言語】底を指定して対数を求める方法(log関数の応用)

参考:logflogl 関数など

loglog2log10 関数は全て、引数と返却値の型が double でした。

C言語には、これらの関数に対応する形で、引数と返却値の型が float の関数とlong double 型の関数がそれぞれ用意されています。

logf系関数とlogl関数

#include <math.h>

float logf(float x);
long double logl(long double x);
float log2f(float x);
long double log2l(long double x);
float log10f(float x);
long double log10l(long double x);

loglog2log10 関数と上記の関数の違いは引数と返却値の “型” です。

例えば、計算結果の精度を高くしたい、もっと誤差を減らしたいというような場合は、logl 関数のような関数名の最後に l を利用するのが良いと思います。

まとめ

このページでは、C言語での「対数の求め方」について解説しました!

C言語には下記の標準ライブラリ関数が用意されており、これらの関数を利用することで対数を求めることが可能です。

  • log:底を e とする x の対数(e はネイピア数)
  • log2:底を 2 とする x の対数
  • log10:底を 10 とする x の対数

ただし、単に上記関数を実行するだけでは底を e or 2 or 10 とする対数しか求めることができません。

e or 2 or 10 以外を底とする対数の求め方に関しては下記ページで解説していますので、必要に応じてこちらも読んでみてください!

底を指定して対数を求める方法の解説ページアイキャッチ【C言語】底を指定して対数を求める方法(log関数の応用)

同じカテゴリのページ一覧を表示