【C言語】べき乗計算・冪乗計算を行う方法(pow関数)

C言語でべき乗計算および累乗計算を行う方法の解説ページアイキャッチ

このページでは、C言語で「べき乗(冪乗)計算」および「累乗計算」を行う方法について解説します。

一応説明しておくと、べき乗計算は「底」の「指数」乗の値を求める計算となります。

べき乗についての説明図

特に「指数」が自然数である時のべき乗計算を「累乗計算」と呼びます。

pow 関数を利用する方法

特にべき乗計算を行う上で一番手っ取り早い&一番無難なのが、 C言語 の標準ライブラリ関数である pow 関数を利用する方法です。

さらに、この pow 関数の利用により累乗計算も行うことが可能です。

pow 関数

pow 関数のプロトタイプ宣言は下記のようになっています。

pow
#include <math.h>

double pow(double, double)

pow 関数を使用するためには math.h をインクルードしておく必要があります。

MEMO

環境によっては、pow 関数を利用するために libm のリンクが必要な場合があります

もしコンパイルをしてみて "Undefiend Reference....""未解決の外部シンボル...." みたいなエラーが出るようであれば、コンパイル時のオプションに -lm を指定してみてください

libm のリンクが行われてエラーを解決できると思います

pow は、第1引数を「底」、第2引数を「指数」とした時のべき乗計算結果を返却する関数になります。

べき乗についての説明図

例えば xn 乗を計算したいのであれば、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言語」などでググれば具体例などが見つかると思います)。

MEMO

ちなみに私の環境における 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 の掛け算を行なってやれば良いだけです。

exp0 の場合は 1 が返却されるようになっています。00 乗の計算結果も 1 となります。

整数同士の演算だけですので、浮動小数点数の時とは異なり丸め誤差が発生することはありません。ただし pow 関数に比べて桁あふれ(オーバーフロー)が発生しやすいので、その点は要注意ですです。

また2乗したいだけなのであれば、ループを組むまでもなく底の値を掛け合わせるだけで良いです。3乗であれば3回掛け合わせるだけで良いです。

2乗と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 のリンクが必要な場合もあります)。

特に指数が自然数に限定される累乗計算においては、ループを用いれば簡単に計算を実行できますので、こちらの方法の考え方についても理解しておくと良いと思います!