【C言語入門】pow関数でべき乗計算(累乗、二乗、ルート、平方根)

べき乗の計算って使ってますか?計算を行うときに、同じ数字を2回かけたり3回かけたりする必要がある場合があります。

たとえば正方形の面積や立方体の体積を計算する場合などです。べき乗は累乗ともいいます。C言語ではべき乗の計算をするために、pow関数が用意されています。

この記事では、べき乗の計算について

  • べき乗(累乗)とは
  • sqrt関数でルート(平方根)を計算
  • pow関数でべき乗(累乗)を計算
  • という基本的な内容から、

  • 2のべき乗とシフト演算について
  • など応用的な使い方の内容についても解説していきます。

    今回はべき乗の計算について、使い方をわかりやすく解説します!

    べき乗(累乗)とは

    べき乗とは実数mの実数n乗の計算のことです。

    nの値が0.5の場合は1/2乗つまりルート(平方根)を計算することになります。ルートの結果の値を2乗つまり2回かけると実数mの値になります。

    nの値が2の場合は2乗つまり実数mを2回、3の場合は3乗つまり実数mを3回かけることになります。

    べき乗の計算方法について特にルートの計算と2乗の計算について解説していきます。

    sqrt関数でルート(平方根)を計算

    ルートの計算方法について説明します。ルートを計算するにはsqrt関数を使います。

    sqrt関数はヘッダーファイル「math.h」をインクルードする必要があります。sqrt関数は引数の値のルートを計算し、計算結果をdouble型で返します。

    引数にはゼロ以上のdouble型の数値を指定します。

    double sqrt(double x);

    float型の引数を指定しfloat型の値を返す必要がある場合には、sqrtf関数を使用します。

    float sqrtf(float x);

    long double型の引数を指定子long double型の値を返す必要がある場合には、sqrtl関数を使用します。

    long double sqrtl(long double x);

    なおsqrt関数のように算術演算用のライブラリを使用する場合はコンパイルの際に「-lm」を追記する必要がありますのでご注意ください。

    ちなみに「-l」はライブラリをリンクすることを表し、「m」はライブラリの名前「libm.a」を表しています。「libm.a」は数学のライブラリです。

    main.cファイルのgccでのコンパイル例:

    gcc -o main.o main.c -lm

    それではサンプルコードで確認しましょう。

    #include <stdio.h>
    #include <math.h>
     
    int main(void) {
        for(int i = 0; i < 5; i++) {
            // sqrt関数(引数、戻り値:double型)
            printf("%dのルートは%lf(double型)\n", i + 1, sqrt(i + 1));
            
            // sqrtf関数(引数、戻り値:float型)
            printf("%dのルートは%f(float型)\n", i + 1, sqrtf(i + 1));
            
            // sqrtl関数(引数、戻り値:long double型)
            printf("%dのルートは%Lf(long double型)\n", i + 1, sqrtl(i + 1));
        }
        
        return 0;
    }

    実行結果:

    1のルートは1.000000(double型)
    1のルートは1.000000(float型)
    1のルートは1.000000(long double型)
    2のルートは1.414214(double型)
    2のルートは1.414214(float型)
    2のルートは1.414214(long double型)
    3のルートは1.732051(double型)
    3のルートは1.732051(float型)
    3のルートは1.732051(long double型)
    4のルートは2.000000(double型)
    4のルートは2.000000(float型)
    4のルートは2.000000(long double型)
    5のルートは2.236068(double型)
    5のルートは2.236068(float型)
    5のルートは2.236068(long double型)

    このサンプルコードではsqrt、sqrtf、sqrtl関数を使って、1~5までのそれぞれの整数値のルートを計算しています。

    pow関数でべき乗(累乗)を計算

    べき乗の計算を行うには、pow関数を使用します。pow関数もヘッダーファイル「math.h」をインクルードする必要があります。

    pow関数は第1引数の値を第2引数の値でべき乗計算します。第1引数、第2引数、戻り値いずれもdouble型となります。

    double pow(double x, double y);

    その他に第1引数、第2引数、戻り値いずれもfloat型となるpowf関数と、第1引数、第2引数、戻り値いずれもlong double型となるpowl関数があります。

    float powf(float x, float y);
    long double powl(long double x, long double y);

    なおpow関数についても算術演算用のライブラリを使用しますので、コンパイルの際に「-lm」を追記する必要がありますのでご注意ください。

    ルート(平方根)を計算

    pow関数の第2引数を「0.5」と指定することで1/2乗すなわちルートの値を計算することもできます。

    サンプルコードで確認しましょう。

    #include <stdio.h>
    #include <math.h>
     
    int main(void) {   
        for(int i = 0; i < 5; i++) {
            // ルート
            printf("%dのルートは%lf\n", i + 1, pow(i + 1, 0.5));
        }
        
        return 0;
    }

    実行結果:

    1のルートは1.000000
    2のルートは1.414214
    3のルートは1.732051
    4のルートは2.000000
    5のルートは2.236068

    二乗を計算

    pow関数の第2引数を「2.0」と指定すると二乗の値を計算することもできます。

    サンプルコードで確認しましょう。

    #include <stdio.h>
    #include <math.h>
     
    int main(void) {   
        for(int i = 0; i < 5; i++) {
            // 2乗
            printf("%dの2乗は%lf\n", i + 1, pow(i + 1, 2.0));
        }
        
        return 0;
    }

    実行結果:

    1の2乗は1.000000
    2の2乗は4.000000
    3の2乗は9.000000
    4の2乗は16.000000
    5の2乗は25.000000

    三乗を計算

    pow関数の第2引数を「3.0」と指定すると三乗の値を計算することもできます。

    サンプルコードで確認しましょう。

    #include <stdio.h>
    #include <math.h>
     
    int main(void) {   
        for(int i = 0; i < 5; i++) {
            // 3乗
            printf("%dの3乗は%lf\n", i + 1, pow(i + 1, 3.0));
        }
        
        return 0;
    }

    実行結果:

    1の3乗は1.000000
    2の3乗は8.000000
    3の3乗は27.000000
    4の3乗は64.000000
    5の3乗は125.000000

    2のべき乗とシフト演算について

    前述のpow関数を使って2のべき乗の計算することができます。2のべき乗でのかけ算やわり算はビットのシフト演算の結果と等しくなります。

    ちなみにシフト演算とは2進数で羅列されたビットの列を左もしくは右にずらす操作のことです。左シフトの演算子には「<<」と右シフトの演算子には「>>」を使用します。

    サンプルコードを使って確認していきましょう。

    #include <stdio.h>
    #include <math.h>
     
    int main(void) {
        int num = 7;   
        int n = 3;
        
        double result1 = num * pow(2, n);
        printf("%dに2の%d乗をかけた値: %lf\n", num, n, result1);
        printf("%dを%dビット左にシフトした値: %d\n", num, n, num << n);
        
        double result2 = result1 / pow(2,n);
        printf("%lfを2の%d乗でわった値: %lf\n", result1, n, result2);
        printf("%dを%dビット右にシフトした値: %d\n", (int)result1, n, (int)result1 >> n);
        
        return 0;
    }

    実行結果:

    7に2の3乗をかけた値: 56.000000
    7を3ビット左にシフトした値: 56
    56.000000を2の3乗でわった値: 7.000000
    56を3ビット右にシフトした値: 7

    このサンプルコードでは7に2の3乗すなわち8をかけた値と7を3ビット左にシフトした値を比較し、同じ数値になっていることを確認できています。

    また56を2の3乗でわった値と56を3ビット右にシフトした値を比較し、同じ数値になっていることを確認できています。

    まとめ

    ここでは、べき乗の計算について説明しました。

    べき乗の計算を行う場合pow関数を使いますが、コンパイルする際に算術演算用のライブラリファイル「libm.a」にリンクする必要があるので注意してください。

    使いこなすことができるように、この記事を何度も参考にして下さいね!

    LINEで送る
    Pocket

    書いた人

    長野 透

    長野 透

    熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
    お問合せはこちらでも受け付けています。
    [email protected]