C言語のきほん|平方根とべき乗を求める(sqrt、pow)

ルートも累乗も、関数でスマートに計算。sqrt と pow を使って数値計算の基本をしっかり身につけよう

C言語で数値計算をしていると、足し算・引き算・掛け算・割り算だけでは足りない場面が出てきます。
たとえば、ある値の平方根を求めたい、数値を2乗や3乗したい、ある底のべき乗を計算したい、といった場面です。

そんなときに便利なのが、数学関数である sqrt と pow です。

  • sqrt は平方根を求める関数
  • pow はべき乗を求める関数

この2つは、数値計算を行うプログラムでとてもよく使われる基本的な関数です。
たとえば、図形の長さを計算したり、面積や体積を求めたり、指数的な計算を行ったりするときに役立ちます。

C言語では、自分でルート計算や累乗計算の処理を書くこともできますが、それはかなり大変です。
一方、標準ライブラリの数学関数を使えば、複雑な計算も短くわかりやすく書けます。

ただし、便利な反面、知っておきたい注意点もあります。
たとえば、sqrt は負の数にはそのまま使えないこと、pow は引数の組み合わせによって結果が大きくなりすぎることがあること、環境によってはコンパイル時に -lm が必要なことなどです。

この節では、sqrt と pow の基本的な使い方だけでなく、

  • それぞれの関数の意味
  • 引数と返り値
  • 実際の計算例
  • サンプルプログラムの読み方
  • 使うときの注意点

まで、やさしく順番に見ていきます。

平方根とべき乗は、数学でもプログラミングでもとてもよく登場する考え方です。
ここでしっかり理解しておくと、数値計算のプログラムがぐっと書きやすくなります。

sqrt と pow はどんな関数か

平方根やべき乗を求める関数は、math.h に用意されています。
使うときは、まず次のヘッダファイルをインクルードします。

#include <math.h>

この 1 行を書くことで、sqrt や pow を使う準備ができます。

2つの関数の役割をまず表で整理してみましょう。

関数名役割
sqrt平方根を求めるsqrt(9.0) → 3.0
powべき乗を求めるpow(2.0, 3.0) → 8.0

この2つは見た目も役割もはっきりしているので、数学関数の入門としてとても覚えやすい関数です。

sqrt 関数とは

sqrt は、平方根を求める関数です。

関数宣言

#include <math.h>

double sqrt(double x);

機能

x の非負の平方根を計算します。

返却値

x の平方根の値を返します。

使用例

double x = 2.0;
double y = sqrt(x);

この場合、y には 2.0 の平方根である約 1.414213... が入ります。

平方根とは

平方根とは、「2乗すると元の数になる値」のことです。

たとえば、

平方根
42
93
164
255

です。

つまり、

  • 2 × 2 = 4 なので、4 の平方根は 2
  • 3 × 3 = 9 なので、9 の平方根は 3

ということです。

sqrt(25.0) と書けば、25.0 の平方根である 5.0 が求められます。

sqrt の注意点

sqrt を使うときに大切なのは、負の数の平方根はそのまま扱えないという点です。

たとえば、

sqrt(-4.0)

のような計算は、通常の実数の範囲では定義できません。
そのため、負の値をそのまま sqrt に渡すのは避けるのが基本です。

入力値が変数に入る場合は、あらかじめ

if (number < 0.0)

のように確認してから使うと安全です。

pow 関数とは

pow は、べき乗を求める関数です。

関数宣言

#include <math.h>

double pow(double x, double y);

機能

x の y 乗を計算します。

返却値

x の y 乗、つまり xy の値を返します。

使用例

double x = 2.0;
double y = 3.0;
double z = pow(x, y);

この場合、z には 2.0 の 3.0 乗である 8.0 が入ります。

べき乗とは

べき乗とは、同じ数を何回か掛け合わせた結果のことです。

たとえば、

結果
4
8
9
125

です。

pow(2.0, 3.0) は、2.0 を3回掛けるので 8.0 になります。
pow(5.0, 2.0) なら 25.0 です。

底と指数

pow の引数は、次のように考えるとわかりやすいです。

引数意味
第1引数 x
第2引数 y指数

つまり、

pow(2.0, 3.0)

は、

  • 底が 2.0
  • 指数が 3.0

で、結果は 8.0 です。

sqrt と pow の関係

平方根とべき乗は、実は考え方としてつながっています。

たとえば、

  • 9 の平方根は 3
  • 3 の 2乗は 9

というように、平方根と2乗は逆の関係にあります。

このイメージを表にすると、次のようになります。

操作結果
平方根を求めるsqrt(9.0)3.0
2乗するpow(3.0, 2.0)9.0

この関係を理解しておくと、sqrt と pow の役割がよりはっきり見えてきます。

この図では、9 に対して sqrt を使うと 3 になり、3 に対して pow(3, 2) を使うと再び 9 になる流れを表しています。
このように、平方根と2乗は深く関係しています。
sqrt と pow を別々の関数として覚えるだけでなく、こうしたつながりとして理解すると、使い分けがしやすくなります。

サンプルプログラム

ここでは、元のサンプルの内容を保ちつつ、別のシンプルな例に置き換えて説明します。
入力した数値について、平方根と2乗を表示するプログラムです。表示メッセージとコメントも変えています。

ファイル名:12_11_1.c

#include <stdio.h>
#include <math.h>

int main(void)
{
    double value;
    double root_result;
    double square_result;

    printf("数値を入力してください> ");
    scanf("%lf", &value);

    /* 平方根を計算する */
    if (value < 0.0) {
        printf("負の数に対する平方根はここでは扱いません。\n");
    } else {
        root_result = sqrt(value);
        printf("%.3f の平方根は %.6f です。\n", value, root_result);
    }

    /* 2乗を計算する */
    square_result = pow(value, 2.0);
    printf("%.3f の2乗は %.6f です。\n", value, square_result);

    return 0;
}

実行例

たとえば、5.2 を入力した場合は次のようになります。

数値を入力してください> 5.2
5.200 の平方根は 2.280351 です。
5.200 の2乗は 27.040000 です。

この例では、平方根と2乗を両方表示しています。
元のサンプルでは 3乗を計算していましたが、ここではより基本的でイメージしやすい 2乗に変更しています。

このプログラムのポイント

このプログラムでは、特に次の点が大切です。

平方根の前に負の数かどうかを確認している

if (value < 0.0)

sqrt は非負の値に対して使うのが基本なので、先にチェックしています。
こうしておくことで、無理な計算を避けられます。

pow の第2引数で指数を指定している

square_result = pow(value, 2.0);

この 2.0 が指数です。
ここを 3.0 にすれば3乗、4.0 にすれば4乗を求められます。

scanf で %lf を使っている

scanf("%lf", &value);

double 型を入力するときは %lf を使います。
数学関数は double を返すものが多いので、ここも基本として大切です。

pow はどんな場面で便利か

pow は「何乗かしたい」ときにそのまま使えるので、とても便利です。

たとえば、次のような計算に使えます。

計算したい内容書き方
2 の 5乗pow(2.0, 5.0)
10 の 3乗pow(10.0, 3.0)
半径 r の2乗pow(r, 2.0)
長さ x の3乗pow(x, 3.0)

もちろん、2乗だけなら x * x と書く方法もあります。
ですが、指数が変わる場合や「べき乗であること」をはっきり表したい場合には、pow を使うとわかりやすくなります。

sqrt はどんな場面で便利か

sqrt は、長さや距離を求めるときによく使います。

たとえば、

  • 直角三角形の斜辺を求める
  • 2点間の距離を計算する
  • 面積から1辺の長さを求める

といった計算です。

たとえば、面積が 36 の正方形の1辺を求めるなら、

sqrt(36.0)

で 6.0 が得られます。

コンパイル時の注意

環境によっては、数学関数を使うときにコンパイル時に -lm オプションが必要です。

gcc ex12_5_1.c -o ex12_5_1 -lm

これは数学ライブラリをリンクするための指定です。
環境によっては不要なこともありますが、sqrt や pow が使えないというエラーが出た場合は、この指定を思い出すと役立ちます。

浮動小数点数の誤差に注意

sqrt や pow は double 型の値を返します。
double はとても便利ですが、実数を完全にそのまま表せるわけではないため、わずかな誤差が生じることがあります。

そのため、計算結果を見たときに

  • 思ったより小数点以下が長い
  • ぴったりの値に見えない

ということが起こる場合があります。

これは数学関数が間違っているのではなく、浮動小数点数の性質によるものです。
この点を知っておくと、結果を見たときに慌てずに済みます。

この図では、sqrt と pow を使うときに知っておきたい注意点をまとめています。
特に、sqrt は負の数をそのまま渡さないこと、環境によっては -lm が必要なことは、実際にプログラムを書くときによく出会うポイントです。

sqrt と pow を学ぶ意味

この2つの関数は、数学関数の中でも特に基本で、使う機会が多い関数です。

学べること内容
平方根の求め方sqrt でルートを計算できる
べき乗の求め方pow で累乗を計算できる
math.h の使い方数学関数を使う準備がわかる
入力値チェックsqrt の前に負の数を確認する考え方
double 型の扱い浮動小数点数の計算に慣れられる

sqrt と pow を使えるようになると、ただの四則演算だけでは書けなかった計算が、ぐっと簡単に書けるようになります。
図形、物理、統計、ゲームの計算など、いろいろな場面で役立つとても大切な関数です。