平方根を求める | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要

以下は目次です。

目的

ある数の平方根を求めたいとします。

たとえば、9 という数の平方根には、3 のほかに -3 も存在しますが、ここでの平方根は正の方を指すことにします。

負数の平方根を求めようとした場合、そのような数は存在しないのでエラーになります。こういったエラーをきちんと検出できるように関数化してみます。

/*
    正の平方根を求める

    引数
        x: 対象の値
        result: 結果を受け取るメモリアドレス。ヌルポインタは不可。

    戻り値
        成否。false が返された場合、result の内容は不定。
*/
bool square_root(double x, double* result);

方法①(標準ライブラリ関数を使う)

標準ライブラリには、平方根を求める sqrt関数と、その型違いのバージョンがあります。

double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);

それぞれ、x の平方根を計算して、結果を戻り値で返します。

整数型のものがないので、整数の平方根を求めるのなら、基本的には sqrt関数を選ぶことになります。

【上級】結果を整数型にしなければならないのなら、丸め関数(第48章)を検討しましょう。普通に整数型へ型変換した場合に、変換後の型で表現できないと、未定義の動作になってしまいます(第21章)。

ごく単純には、次のように使えます。

double x = sqrt(9.0);  // 9 の平方根

この例のように、エラーが起こる余地がない使い方なら良いのですが、そうでないなら備えが必要です。sqrt系の関数は、実引数に負数を与えると、定義域エラーになります。

数学系関数が発生させるエラーについての詳細は、第48章を参照してください。ここでは、これらのエラーを検出するように関数化します。

#include <assert.h>
#include <errno.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>

/*
    正の平方根を求める

    引数
        x: 対象の値
        result: 結果を受け取るメモリアドレス。ヌルポインタは不可。

    戻り値
        成否。false が返された場合、result の内容は不定。
*/
bool square_root(double x, double* result)
{
    assert(result != NULL);

    errno = 0;
    *result = sqrt(x);
    if (errno == EDOM) {
        return false;
    }

    return true;
}

int main(void)
{
    double result;

    if (square_root(9.0, &result)) {
        printf("%lf\n", result);
    }
    else {
        puts("error");
    }

    if (square_root(10.0, &result)) {
        printf("%lf\n", result);
    }
    else {
        puts("error");
    }

    if (square_root(-9.0, &result)) {
        printf("%lf\n", result);
    }
    else {
        puts("error");
    }
}

実行結果:

3.000000
3.162278
error


参考リンク


更新履歴



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る