C言語のきほん|数学関数を使う

面倒な計算も、C言語なら関数でスマートに。数学関数を使いこなして、数値計算の世界を広げよう

C言語でプログラムを書いていると、足し算や引き算だけでは足りない場面がだんだん増えてきます。
たとえば、平方根を求めたい、べき乗を計算したい、角度から三角比を求めたい、端数を切り上げたい、といった場面です。

こうした計算をすべて自分で一から作ることも不可能ではありません。
でも、毎回それを行うのは大変ですし、間違いも起こりやすくなります。
そこで活躍するのが、C言語の標準ライブラリに用意されている数学関数です。

数学関数を使うと、複雑に見える数値計算も、関数を呼び出すだけで簡潔に書けるようになります。
たとえば、

  • sqrt で平方根を求める
  • pow で累乗を求める
  • sin や cos で三角関数を使う
  • ceil や floor で端数処理を行う
  • fabs で絶対値を求める

といったことができます。

これらの関数は、計算式を短くわかりやすく書けるだけでなく、長年使われてきた標準的な仕組みとして、安心して利用しやすいのも大きな利点です。

ただし、数学関数を使うときには、いくつか知っておきたいポイントもあります。
たとえば、math.h をインクルードする必要があること、環境によっては数学ライブラリのリンク指定が必要なこと、浮動小数点数には誤差があることなどです。

この節では、数学関数とは何かを確認したあと、よく使われる代表的な数学関数を見ながら、使い方や注意点をやさしく整理していきます。
数値計算のプログラムは、数学関数を知っているだけでぐっと書きやすくなります。ここで基本をしっかり押さえていきましょう。

数学関数とは

数学関数とは、数値計算を行うために標準ライブラリとして用意されている関数群のことです。
C言語では、単純な四則演算だけでなく、平方根、べき乗、三角関数、対数、丸め処理など、さまざまな計算を関数として利用できます。

これらの関数を使うには、次のヘッダファイルをインクルードします。

#include <math.h>

この 1 行を書くことで、数学関数を使う準備ができます。

数学関数を使う理由

数学関数を使うとよい理由は、主に次のようなものです。

理由内容
計算を簡潔に書ける複雑な計算も関数呼び出しで表現できる
自作の手間を減らせる平方根や三角関数を自分で実装しなくてよい
読みやすいsqrt や pow という名前から役割がわかりやすい
標準的で使いやすい多くの環境で同じ考え方で利用できる

たとえば、x の平方根を求めたいとき、sqrt(x) と書けるのはとても便利です。
見た目にも意味がはっきりしているので、あとからコードを読み返したときにも理解しやすくなります。

代表的な数学関数

数学関数にはたくさんの種類がありますが、ここではよく使われる代表的なものを整理して見ていきます。

三角関数

関数名内容
sin(x)正弦
cos(x)余弦
tan(x)正接

三角関数は、角度や波の計算、座標の計算などでよく使われます。
ただし、C言語の多くの数学関数では、角度は度数法ではなくラジアンで扱います。

逆三角関数

関数名内容
asin(x)逆正弦
acos(x)逆余弦
atan(x)逆正接

逆三角関数は、三角比から角度を求めたいときに使います。

指数・対数関数

関数名内容
exp(x)e の x 乗
log(x)自然対数
log10(x)常用対数

指数関数や対数関数は、成長の計算やスケール変換などで登場します。

累乗・平方根関数

関数名内容
pow(x, y)x の y 乗
sqrt(x)平方根
cbrt(x)立方根

この中でも sqrt と pow は特によく使われます。
数学関数の入門として最初に触れることが多い関数です。

双曲線関数

関数名内容
sinh(x)双曲線正弦
cosh(x)双曲線余弦
tanh(x)双曲線正接

学習の初期では使う機会は多くないかもしれませんが、数値計算や工学系の計算で使われることがあります。

その他の数学関数

関数名内容
ceil(x)x 以上の最小整数
floor(x)x 以下の最大整数
round(x)四捨五入
fmod(x, y)x を y で割った余り
fabs(x)絶対値

特に ceil、floor、round は、端数処理を行いたいときに便利です。
fabs は浮動小数点数の絶対値を求める関数です。

数学関数のイメージを図で理解する

数学関数は種類が多いので、何をする関数なのかをざっくり整理した図があると理解しやすくなります。

この図では、数学関数を種類ごとに分けて整理しています。
数学関数は数が多いですが、役割ごとに分類して見ると、どの関数をどんな場面で使うのかがつかみやすくなります。
最初は全部を覚える必要はありません。まずは sqrt、pow、fabs、round あたりから慣れていくと学びやすいです。

よく使う数学関数を具体的に見てみよう

ここでは、特に使う機会の多い関数をもう少し具体的に見ていきます。

sqrt

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

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

この場合、y には 5.0 が入ります。

pow

pow は累乗を求める関数です。

double a = pow(2.0, 3.0);

この場合、a には 8.0 が入ります。

fabs

fabs は浮動小数点数の絶対値を求めます。

double v = fabs(-3.5);

この場合、v には 3.5 が入ります。

ceil と floor

ceil は切り上げ、floor は切り捨てです。

double a = ceil(2.3);   /* 3.0 */
double b = floor(2.8);  /* 2.0 */

round

round は四捨五入を行います。

double a = round(2.4);  /* 2.0 */
double b = round(2.5);  /* 3.0 */

シンプルなサンプルプログラム

平方根、べき乗、絶対値をまとめて表示する例です。

ファイル名:12_10_1.c

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

int main(void)
{
    double number = 16.0;
    double root;
    double power;
    double absolute_value;

    /* 平方根を求める */
    root = sqrt(number);

    /* 2乗を求める */
    power = pow(number, 2.0);

    /* 絶対値を求める */
    absolute_value = fabs(-12.5);

    printf("元の値: %.1f\n", number);
    printf("平方根: %.1f\n", root);
    printf("2乗した値: %.1f\n", power);
    printf("絶対値: %.1f\n", absolute_value);

    return 0;
}

実行イメージ

元の値: 16.0
平方根: 4.0
2乗した値: 256.0
絶対値: 12.5

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

この例では、数学関数を3つ使っています。

関数役割結果
sqrt(number)平方根を求める4.0
pow(number, 2.0)number の 2乗を求める256.0
fabs(-12.5)絶対値を求める12.5

このように、1つのプログラムの中で複数の数学関数を組み合わせることも簡単にできます。

数学関数を使うときの注意

数学関数を使うときは、いくつか注意しておきたい点があります。

math.h のインクルードが必要

数学関数を使うには、まず

#include <math.h>

が必要です。

環境によっては -lm が必要

環境によっては、コンパイル時に数学ライブラリをリンクするために -lm オプションが必要です。

gcc program.c -o program -lm

これは特に gcc 系でよく見られる書き方です。

浮動小数点数には誤差がある

実数はコンピュータの中で完全にそのまま表せるとは限りません。
そのため、計算結果にわずかな誤差が生じることがあります。

たとえば、見た目ではちょうど 0.3 になりそうでも、内部的にはごく小さな誤差を含むことがあります。
このため、浮動小数点数どうしを比較するときは注意が必要です。

範囲外の計算では特別な値になることがある

数学関数では、計算結果が大きすぎたり、定義域の外だったりすると、

  • inf
  • NaN

のような特別な結果になることがあります。

たとえば、負の値に対して平方根を求めようとしたときなどは注意が必要です。

この図では、数学関数を使うときに押さえておきたい注意点をまとめています。
関数そのものの使い方だけでなく、ヘッダファイル、リンク指定、浮動小数点誤差、範囲外の値といった点も理解しておくと、トラブルを減らしやすくなります。

数学関数を学ぶときのコツ

数学関数は種類が多いので、最初から全部を覚えようとすると大変です。
そこで、まずはよく使う関数から順番に慣れていくのがおすすめです。

優先して覚えたい関数理由
sqrt平方根はよく使う
pow累乗計算は登場しやすい
fabs絶対値は基本的で便利
ceil / floor / round端数処理でよく使う

このあたりを使えるようになると、C言語での数値計算の幅がかなり広がります。

数学関数を使いこなすための心構え

数学関数はとても便利ですが、単に関数名を覚えるだけではなく、

  • 何を返す関数なのか
  • 引数に何を渡すのか
  • 結果の型はどうなるのか
  • 誤差や範囲外にどう注意するのか

といった点まで意識できるようになると、より安心して使えるようになります。

特に C言語では、整数と浮動小数点数の違いや、表示書式の選び方もいっしょに意識することが大切です。

数学関数を使えるようになると、簡単な計算プログラムから、シミュレーション、図形処理、工学計算まで、できることが大きく広がっていきます。
数値を扱うプログラムを書くうえで、とても心強い道具なので、まずは代表的な関数から少しずつ使い慣れていきましょう。