このページでは、C言語で「べき乗(冪乗)計算」および「累乗計算」を行う方法について解説します。
一応説明しておくと、べき乗計算は「底」の「指数」乗の値を求める計算となります。
特に「指数」が自然数である時のべき乗計算を「累乗計算」と呼びます。
Contents
pow
関数を利用する方法
特にべき乗計算を行う上で一番手っ取り早い&一番無難なのが、 C言語 の標準ライブラリ関数である pow
関数を利用する方法です。
さらに、この pow
関数の利用により累乗計算も行うことが可能です。
pow
関数
pow
関数のプロトタイプ宣言は下記のようになっています。
#include <math.h>
double pow(double, double)
pow
関数を使用するためには math.h
をインクルードしておく必要があります。
環境によっては、pow
関数を利用するために libm
のリンクが必要な場合があります
もしコンパイルをしてみて "Undefiend Reference...."
や "未解決の外部シンボル...."
みたいなエラーが出るようであれば、コンパイル時のオプションに -lm
を指定してみてください
libm
のリンクが行われてエラーを解決できると思います
pow
は、第1引数を「底」、第2引数を「指数」とした時のべき乗計算結果を返却する関数になります。
例えば x
の n
乗を計算したいのであれば、pow(x, n)
を実行すれば良いことになります。
スポンサーリンク
pow
を用いてべき乗計算を行う
pow
関数はべき乗計算を行う関数ですので、べき乗計算は pow
関数を呼び出すだけで実行することが可能です。
下記は pow
関数を用いてべき乗計算を行う例になります。
#include <stdio.h> /* printf */
#include <math.h> /* pow */
int main(void) {
double ans;
double base, exp;
base = 100;
exp = 1.5;
ans = pow(base, exp);
printf("%f ^ %f = %f\n", base, exp, ans);
base = 10000;
exp = -1.25;
ans = pow(base, exp);
printf("%f ^ %f = %f\n", base, exp, ans);
return 0;
}
実行結果は下記のようになります。
100.000000 ^ 1.500000 = 1000.000000 10000.000000 ^ -1.250000 = 0.000010
上記のように、pow
関数では第2引数の指数 exp
が実数や負数であってもべき乗計算を行うことが可能です。
pow
を用いて累乗計算を行う
累乗計算とは、前述の通りべき乗計算における「指数が自然数の場合」の特別な呼び方というだけであって、べき乗の一種です。従って累乗計算も pow
関数により実行可能です。
下記が pow
関数を用いて累乗計算を行う例になります。
#include <stdio.h> /* printf */
#include <math.h> /* pow */
int main(void) {
double ans;
double base, exp;
base = 100;
exp = 2;
ans = pow(base, exp);
printf("%f ^ %f = %f\n", base, exp, ans);
base = 12.5;
exp = 5;
ans = pow(base, exp);
printf("%f ^ %f = %f\n", base, exp, ans);
return 0;
}
要は、pow
の第2引数に自然数を指定すれば良いだけですので、pow
関数を利用すればべき乗計算も累乗計算もそんなに意識することなく実行することが可能です。
pow
を用いて整数型に対する累乗計算を行う
ここまでの例では全て、pow
関数の “引数に指定する変数” や “返却値を受け取る変数” を double
型の変数としてきました。
ただ、int
型等の整数型の変数に対して累乗計算を行い、整数型の変数で累乗計算結果を受け取りたい場合も多いと思います。
この場合でも pow
関数を利用することはできるのですが、pow
関数の引数や返却値は double
型の浮動小数点数として扱われますので、底と指数の両方が整数であっても、環境によっては pow
関数の返却値に誤差が出る “可能性がある” ようですので注意が必要です(「pow 整数 誤差 C言語」などでググれば具体例などが見つかると思います)。
ちなみに私の環境における pow
関数は底と指数の両方が整数の場合は誤差が発生しないように作られているようでした(実行結果からの推測ですが)
もし、誤差が出てしまうような場合は、pow
関数の結果を round
関数により一番近い整数に丸めてから整数型の変数に代入する等の対応をした方が良いと思います。
round
関数は引数で与えられた値の小数点以下を四捨五入する関数になります(使用する際は math.h
をインクルードする必要あり)。
ただ、そもそも整数型に対する累乗計算であれば pow 関数を使わない方法 で紹介する方法で簡単に求められますし、誤差が発生するのを防ぎたいのであればこちらの方が無難かもしれないです。
下記は、pow
関数により整数型の変数に対して累乗計算を行う例になります。
#include <stdio.h> /* printf */
#include <math.h> /* pow */
int main(void) {
int ans;
int base, exp;
base = 100;
exp = 2;
ans = pow(base, exp);
printf("%d ^ %d = %d\n", base, exp, ans);
base = 99;
exp = 3;
ans = pow(base, exp);
printf("%d ^ %d = %d\n", base, exp, ans);
return 0;
}
結果に誤差があるようであれば、下記のように round
関数を利用するのが良いと思います。
#include <stdio.h> /* printf */
#include <math.h> /* pow */
int main(void) {
int ans;
int base, exp;
base = 100;
exp = 2;
ans = round(pow(base, exp));
printf("%d ^ %d = %d\n", base, exp, ans);
base = 99;
exp = 3;
ans = round(pow(base, exp));
printf("%d ^ %d = %d\n", base, exp, ans);
return 0;
}
スポンサーリンク
pow
関数を使わない方法(累乗のみ)
ここまで pow
関数を利用してべき乗計算および累乗計算を行なってきましたが、(指数が自然数に限定されている)累乗計算程度であれば pow
関数を使わなくてもループを使えば簡単に自力で計算できます。
例えば下記の my_pow
は、for
ループにより累乗計算を行う関数となります。引数 base
が「底」で、引数 exp
が「指数」である時の累乗計算を行います。引数 exp
には自然数を指定します(0
もオーケー)。
int my_pow(int base, unsigned int exp) {
unsigned int i;
int ans;
ans = 1;
for (i = 0; i < exp; i++) {
ans = ans * base;
}
return ans;
}
累乗とは要は「底」を「指数」回掛け合わせる計算なので、上記のように exp
回分実行されるループの中で base
の掛け算を行なってやれば良いだけです。
exp
が 0
の場合は 1
が返却されるようになっています。0
の 0
乗の計算結果も 1
となります。
整数同士の演算だけですので、浮動小数点数の時とは異なり丸め誤差が発生することはありません。ただし pow
関数に比べて桁あふれ(オーバーフロー)が発生しやすいので、その点は要注意ですです。
また2乗したいだけなのであれば、ループを組むまでもなく底の値を掛け合わせるだけで良いです。3乗であれば3回掛け合わせるだけで良いです。
/* baseの2乗の計算 */
ans = base * base;
/* baseの3条の計算 */
ans = base * base * base;
^
演算子ではべき乗計算や累乗計算できないので注意
累乗やべき乗を x ^ n
のように ^
演算子を用いて表されることも多いですが、C言語における ^
演算子は排他的論理和(論理演算の一つ)を行うための演算子になります。
例えば下記を実行すれば、ans
には 258
が代入されることになってしまいます。
ans = 256 ^ 2;
排他的論理和はべき乗や累乗とは全く異なる演算ですので注意してください。ちなみに私は累乗を計算するために上記のような計算を行なってうまく動作せず、しばらく悩んでいたことがあります…。
C言語には「べき乗や累乗を行う演算子は存在しない」ということも覚えておくと良いと思います!
まとめ
このページでは、C言語で「べき乗計算」および「累乗計算」を行う方法について解説しました!
いずれにおいても pow
関数を利用して求めることが可能です。pow
関数を利用するためには math.h
のインクルードが必要なので注意してください(libm
のリンクが必要な場合もあります)。
特に指数が自然数に限定される累乗計算においては、ループを用いれば簡単に計算を実行できますので、こちらの方法の考え方についても理解しておくと良いと思います!
[…] べき乗計算・冪乗計算を行う方法 (C言語/pow 関数) | だえうホームページ […]