言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

C言語辞典

  1. トップページ
  2. C言語辞典
  3. sqrt() / pow() / fabs() / ceil() / floor()

sqrt() / pow() / fabs() / ceil() / floor()

対応: C89(1989)

平方根・べき乗・絶対値・切り上げ・切り捨てなど、よく使う数学関数です。『<math.h>』に定義されており、コンパイル時に『-lm』リンクオプションが必要な場合があります。

構文

double sqrt(double x); // x の正の平方根を返します(x >= 0 が必要です)。
double pow(double x, double y); // x の y 乗を返します。
double fabs(double x); // double 型の絶対値を返します。
double ceil(double x); // x 以上の最小の整数値(切り上げ)を返します。
double floor(double x); // x 以下の最大の整数値(切り捨て)を返します。
double round(double x); // 最も近い整数に四捨五入します(C99以降)。
double fmax(double x, double y);// x と y の大きい方を返します(C99以降)。
double fmin(double x, double y);// x と y の小さい方を返します(C99以降)。

関数一覧

関数概要
sqrt()平方根です。sqrt(9.0) → 3.0
pow()べき乗です。pow(2.0, 10.0) → 1024.0
fabs()絶対値です。fabs(-3.5) → 3.5
ceil()天井関数(切り上げ)です。ceil(1.2) → 2.0
floor()床関数(切り捨て)です。floor(1.9) → 1.0
round()四捨五入です。round(1.5) → 2.0
fmax()大きい方の値です。fmax(3.0, 5.0) → 5.0
fmin()小さい方の値です。fmin(3.0, 5.0) → 3.0

サンプルコード

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

int main(void) {
    printf("sqrt(2.0) = %.6f\n", sqrt(2.0));
    printf("2^10 = %.0f\n", pow(2.0, 10.0));
    printf("fabs(-3.7) = %.1f\n", fabs(-3.7));

    double val = 2.3;
    printf("ceil(%.1f) = %.1f\n", val, ceil(val));
    printf("floor(%.1f) = %.1f\n", val, floor(val));

    double neg = -2.3;
    printf("ceil(%.1f) = %.1f\n", neg, ceil(neg));
    printf("floor(%.1f) = %.1f\n", neg, floor(neg));

    /* ユークリッド距離(3-4-5 の直角三角形) */
    double dx = 3.0, dy = 4.0;
    printf("距離 = %.1f\n", sqrt(dx*dx + dy*dy));

    return 0;
}

コンパイルして実行すると次のようになります。

gcc sqrt_pow_fabs_ceil_floor.c -o sqrt_pow_fabs_ceil_floor -lm
./sqrt_pow_fabs_ceil_floor
sqrt(2.0) = 1.414214
2^10 = 1024
fabs(-3.7) = 3.7
ceil(2.3) = 3.0
floor(2.3) = 2.0
ceil(-2.3) = -2.0
floor(-2.3) = -3.0
距離 = 5.0

round / fmax / fmin の活用

round() は四捨五入、fmax()・fmin() は2値の大小比較に使います。スコア計算やクリッピング(値域制限)によく使われます。

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

/* 値を [lo, hi] の範囲にクリッピングします。 */
double clamp(double val, double lo, double hi) {
    return fmin(fmax(val, lo), hi);
}

int main(void) {
    double scores[] = {78.4, 85.6, 92.1, 66.9};
    int n = (int)(sizeof(scores) / sizeof(scores[0]));

    printf("round と clamp の例:\n");
    for (int i = 0; i < n; i++) {
        double r = round(scores[i]);
        double c = clamp(scores[i], 70.0, 90.0);
        printf("  %.1f → round:%.0f, clamp(70-90):%.1f\n", scores[i], r, c);
    }
    return 0;
}

コンパイルして実行すると次のようになります。

gcc sqrt_round_clamp.c -o sqrt_round_clamp -lm
./sqrt_round_clamp
round と clamp の例:
  78.4 → round:78, clamp(70-90):78.4
  85.6 → round:86, clamp(70-90):85.6
  92.1 → round:92, clamp(70-90):90.0
  66.9 → round:67, clamp(70-90):70.0

よくあるミス

よくあるミス: sqrt に負の値を渡す

sqrt() は負の値を渡すと NaN(非数)を返します。使用前に引数が 0 以上であることを確認します。

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

int main(void) {
    /* NG: 負の値を渡すと NaN が返る */
    printf("NG: sqrt(-1.0) = %f\n", sqrt(-1.0)); /* nan */
    return 0;
}

修正後は次の通りです。

gcc sqrt_negative_ng.c -o sqrt_negative_ng -lm
./sqrt_negative_ng
NG: sqrt(-1.0) = -nan
sqrt_negative_ok.c
#include <stdio.h>
#include <math.h>

int main(void) {
    double values[] = {-1.0, 0.0, 2.0, 9.0};
    int n = (int)(sizeof(values) / sizeof(values[0]));

    for (int i = 0; i < n; i++) {
        if (values[i] < 0.0) {
            printf("sqrt(%.1f) = 定義域外\n", values[i]);
        } else {
            printf("sqrt(%.1f) = %.6f\n", values[i], sqrt(values[i]));
        }
    }
    return 0;
}

修正後は次の通りです。

gcc sqrt_negative_ok.c -o sqrt_negative_ok -lm
./sqrt_negative_ok
sqrt(-1.0) = 定義域外
sqrt(0.0) = 0.000000
sqrt(2.0) = 1.414214
sqrt(9.0) = 3.000000

概要

コンパイルコマンドに『-lm』フラグを付けないとリンクエラーになる環境があります(例:GCC on Linux)。

sqrt() に負の値を渡すと NaN(非数)が返ります。引数が正であることを必ず確認してください。エラー状態は errno や fpclassify() で検出できます。

三角関数については『sin() / cos() / tan()』、対数・指数については『log() / exp()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。