このページでは、C言語での「対数の求め方」について解説していきます!
x が下記の式で表される時、p のことを「底を b とする x の対数」と呼びます。この対数 p を求めていきます!
$$ x = b ^ p $$
Contents
log・log2・log10 関数
この対数は、C言語では log・log2・log10 関数を利用することで求めることができます。
log・log2・log10 関数の宣言
log・log2・log10 関数は下記のように宣言されています。
#include <math.h>
double log(double x);
double log2(double x);
double log10(double x);
これらの関数を利用する際には math.h をインクルードする必要があります。
スポンサーリンク
log・log2・log10 関数の返却値
これらの関数の返却値はそれぞれ下記のようになります。要は、それぞれ \( \log_e x \)・\( \log_2 x \)・\( \log_{10} x \) の計算結果を返却する関数ということです。
log:底をeとするxの対数(eはネイピア数)log2:底を2とするxの対数log10:底を10とするxの対数
例えば x が 256 である時、x は 2 の冪乗の形式で下記のように表すことができます。
$$ x = 2 ^ 8 $$
そのため、底を 2 とする x の対数は 8 ということになり、log2(x) においても返却値が 8.0 となります(返却値の型は double)。
log・log2・log10 関数の引数の注意点
これらの関数は、要は引数 x に対し、下記の式が成立する際の p を求める関数です(底 b は前述の通り使用する関数によって異なります)
$$ x = b ^ p $$
そのため、基本的には引数 x には 0 でない “正の” 実数を指定することになります。
例えば x が 0 の場合、は下記の式が成立する p が関数の返却値になりますが、おそらく環境によって結果は異なるのではないかと思います。
$$ 0 = b ^ p $$
私の環境では -inf が返却されますが、環境によっては 0 が返却される場合もあるようです。なので、引数 x には 0 は指定しない方が無難だと思います。
また、log・log2・log10 関数ともに底 b は正の値ですので、x が負の値の場合は下記が成立する実数 p は存在しません(正の値を何乗しても負の値にならない)。
$$ x = b ^ p $$
これも環境によって結果が異なる可能性がありますので、引数 x には負の値は指定しない方が無難だと思います(私の環境だと nan が返却されました)。
log・log2・log10 関数の使用例
紹介するほどのものでもないかもしれませんが、次に log・log2・log10 関数の使用例を紹介しておきます。
まず、下記は log・log2・log10 関数において全て結果が 1.0 となる例になります。
printf("%f\n", log(exp(1)));
printf("%f\n", log2(2));
printf("%f\n", log10(10));
exp 関数に関しては下記ページで紹介していますので、詳しく知りたい方は下記ページをご参照ください。
また、下記は x を 1 〜 10 に変化させながら log・log2・log10 関数それぞれの実行結果を表示する例になります。
for (int x = 1; x <= 10; x++){
printf("x:%f,%f,%f\n", x, log(x), log2(x), log10(x));
}
スポンサーリンク
他の底の対数を求める方法
log・log2・log10 関数を利用することで、底が下記の場合の対数を求めることができるようになりましたね!
e210
では、C言語では他の値を底とする対数は求められないのでしょうか?
当然可能です!
この「任意の値を底に指定して対数を求める方法」については別途下記ページで解説しておりますので、興味のある方はこちらをご参照いただければと思います。
参考:logf・logl 関数など
log・log2・log10 関数は全て、引数と返却値の型が double でした。
C言語には、これらの関数に対応する形で、引数と返却値の型が float の関数とlong double 型の関数がそれぞれ用意されています。
#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);
log・log2・log10 関数と上記の関数の違いは引数と返却値の “型” です。
例えば、計算結果の精度を高くしたい、もっと誤差を減らしたいというような場合は、logl 関数のような関数名の最後に l を利用するのが良いと思います。
まとめ
このページでは、C言語での「対数の求め方」について解説しました!
C言語には下記の標準ライブラリ関数が用意されており、これらの関数を利用することで対数を求めることが可能です。
log:底をeとするxの対数(eはネイピア数)log2:底を2とするxの対数log10:底を10とするxの対数
ただし、単に上記関数を実行するだけでは底を e or 2 or 10 とする対数しか求めることができません。
e or 2 or 10 以外を底とする対数の求め方に関しては下記ページで解説していますので、必要に応じてこちらも読んでみてください!

