このページでは、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
関数を利用することで、底が下記の場合の対数を求めることができるようになりましたね!
e
2
10
では、C言語では他の値を底とする対数は求められないのでしょうか?
当然可能です!
この「任意の値を底に指定して対数を求める方法」については別途下記ページで解説しておりますので、興味のある方はこちらをご参照いただければと思います。
【C言語】底を指定して対数を求める方法(log関数の応用)参考: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
以外を底とする対数の求め方に関しては下記ページで解説していますので、必要に応じてこちらも読んでみてください!