読み込み中...

C言語とmath.h!基本から学ぶ7つのステップ

C言語のコードを書く人が画面に向かっているイメージ C言語
この記事は約17分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミングの世界では、特定の問題を解決するために必要なツールや関数を集めたものを「ライブラリ」と呼びます。

その中でも、C言語の「math.h」ライブラリは数学的な計算を助けてくれる機能が詰まったライブラリで、多くのプログラマーにとって欠かせない存在です。

この記事では、C言語のmath.hライブラリの基本的な機能と使い方を解説します。

初心者向けに詳しく説明し、具体的な使用方法や注意点、カスタマイズ方法までを学べる内容となっています。

これからmath.hを使いこなしたいと思っている方は、ぜひ参考にしてください。

●math.hとは何か

math.hは、C言語で数学的な計算を行うためのライブラリです。

このライブラリは様々な数学関数を提供しており、絶対値や平方根、指数関数など、基本的な数学の操作からトリガノメトリ、対数といった高度な数学までカバーしています。

ライブラリとは、予め定義された関数やマクロなどの集合体で、プログラムを効率的に書くための便利なツールです。

それらを利用することで、プログラマーは複雑な処理を一から書く必要がなく、時間と労力を節約できます。

●基本的なmath.hの関数

それでは具体的に、math.hライブラリで利用可能な関数の一部を紹介していきます。

各関数については、その概要と共にサンプルコードを交えて解説します。

○fabs関数の使い方とサンプルコード

fabs関数は、引数として与えられた実数の絶対値を返す関数です。

例えば、次のようにコードを書くことで、絶対値を求めることができます。

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

int main() {
    double a = -7.5;
    printf("絶対値は %f\n", fabs(a));
    return 0;
}

このコードでは、aという変数に-7.5という実数を代入し、その絶対値を求めています。

printf関数によって結果を表示しています。

このコードを実行すると、「絶対値は 7.500000」と表示されます。

○ceil関数の使い方とサンプルコード

ceil関数は、引数として与えられた実数の小数点の切り上げを行う関数です。

引数が整数であればそのままの値を返し、引数が小数であれば、その値を超えない最小の整数を返します。

ceil関数を使って小数点を切り上げるコードの例を紹介します。

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

int main() {
    double a = 5.2;
    printf("切り上げた結果は %f\n", ceil(a));
    return 0;
}

このコードでは、aという変数に5.2という実数を代入し、その小数点を切り上げています。

printf関数によって結果を表示しています。このコードを実行すると、「切り上げた結果は 6.000000」と表示されます。

○floor関数の使い方とサンプルコード

floor関数は、引数として与えられた実数の小数点の切り下げを行う関数です。

引数が整数であればそのままの値を返し、引数が小数であれば、その値以下の最大の整数を返します。

floor関数を使って小数点を切り下げるコードの例を紹介します。

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

int main() {
    double a = 5.8;
    printf("切り下げた結果は %f\n", floor(a));
    return 0;
}

このコードでは、aという変数に5.8という実数を代入し、その小数点を切り下げています。

printf関数によって結果を表示しています。

このコードを実行すると、「切り下げた結果は 5.000000」と表示されます。

○sqrt関数の使い方とサンプルコード

次に、sqrt関数について解説します。

sqrt関数は、指定した数値の平方根を求めるために使用します。

平方根とは、ある数値を自分自身で乗じると元の数値になる数のことを指します。

例えば、9の平方根は3で、これは3×3=9となるからです。

sqrt関数を使用して実数の平方根を求めるコードの例を紹介します。

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

int main() {
    double a = 25.0;
    printf("25.0の平方根は %f\n", sqrt(a));
    return 0;
}

このコードでは、aという変数に25.0という実数を代入し、その平方根を求めています。

printf関数によって結果を表示しています。

このコードを実行すると、「25.0の平方根は 5.000000」と表示されます。

つまり、25の平方根は5であることを示しています。

ただし、sqrt関数を使う際には注意が必要です。sqrt関数に負の値を入力すると、数学的には虚数が出てきますが、C言語のmath.hライブラリのsqrt関数では虚数を扱うことはできません。

そのため、sqrt関数に負の値を入力すると、NaN(Not a Number)が返されます。

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

int main() {
    double a = -25.0;
    printf("-25.0の平方根は %f\n", sqrt(a));
    return 0;
}

このコードを実行すると、「-25.0の平方根は nan」と表示されます。

これは、sqrt関数が負の数の平方根を扱うことができないためです。

ですから、sqrt関数を使う際には入力値が非負であることを確認することが大切です。

○pow関数の使い方とサンプルコード

引き続き、math.hライブラリの中でも特に頻繁に使用されるpow関数について説明します。

pow関数は、ある数値を指定した回数だけ累乗する際に用いられます。

引数には2つ、基数と指数を取ります。

pow関数の使い方を理解するため、まずはサンプルコードをご覧ください。

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

int main() {
    double base = 2.0;
    double exponent = 3.0;
    printf("2.0の3.0乗は %f\n", pow(base, exponent));
    return 0;
}

このコードでは、まず初めに基数である2.0と指数である3.0をそれぞれdouble型の変数baseとexponentに代入します。

そして、pow関数を用いて2.0の3.0乗を求め、printf関数によって結果を表示しています。

このコードを実行すると、「2.0の3.0乗は 8.000000」と表示されます。つまり、2を3回かけた結果、8になることが確認できます。

さらに、pow関数は指数が分数である場合、すなわち累乗根を求める場合にも使用可能です。

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

int main() {
    double base = 8.0;
    double exponent = 1.0 / 3.0;
    printf("8.0の1/3乗(立方根)は %f\n", pow(base, exponent));
    return 0;
}

このコードでは、指数として1.0/3.0を指定しています。

これにより、8の立方根を求めることができます。このコードを実行すると、「8.0の1/3乗(立方根)は 2.000000」と表示されます。

つまり、2を3回かけると8になることが確認できます。

○sin, cos, tan関数の使い方とサンプルコード

C言語のmath.hライブラリには、三角関数を計算するための関数が含まれています。

今回はその中でも、sin(サイン)関数、cos(コサイン)関数、tan(タンジェント)関数について解説します。

これらの関数は引数にラジアン値を取り、それぞれ対応する三角関数の値を返します。

まず、sin関数の使用方法から見ていきましょう。

sin関数を使用したサンプルコードを紹介します。

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

int main() {
    double radian = M_PI / 2.0;  // π/2ラジアン
    printf("sin(pi/2)は %f\n", sin(radian));
    return 0;
}

このコードでは、まずM_PI / 2.0でπ/2ラジアンを計算し、double型の変数radianに格納しています。

そして、sin関数にradianを渡すことでsin(pi/2)の値を計算し、その結果をprintf関数を用いて表示しています。

このコードを実行すると、「sin(pi/2)は 1.000000」と表示されます。

次に、cos関数とtan関数の使用方法を見ていきましょう。

cos関数とtan関数を使用したサンプルコードを紹介します。

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

int main() {
    double radian = M_PI / 3.0;  // π/3ラジアン
    printf("cos(pi/3)は %f\n", cos(radian));
    printf("tan(pi/3)は %f\n", tan(radian));
    return 0;
}

このコードでは、まずM_PI / 3.0でπ/3ラジアンを計算し、double型の変数radianに格納しています。

その後、cos関数とtan関数にradianを渡すことで、それぞれcos(pi/3)、tan(pi/3)の値を計算し、その結果をprintf関数を用いて表示しています。

このコードを実行すると、「cos(pi/3)は 0.500000」、「tan(pi/3)は 1.732051」と表示されます。

○log, log10関数の使い方とサンプルコード

C言語のmath.hライブラリには、自然対数(log)と底が10の対数(log10)を計算するための関数が含まれています。

これらの関数は引数に正の実数を取り、それぞれ対応する対数の値を返します。

今回は、log関数とlog10関数の使い方について、具体的なサンプルコードを交えて解説します。

まず、log関数の使用方法から見ていきましょう。

log関数を使用したサンプルコードを紹介します。

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

int main() {
    double number = 2.718282;  // eの近似値
    printf("log(e)は %f\n", log(number));
    return 0;
}

このコードでは、まず、自然対数の底’e’の近似値をdouble型の変数numberに格納しています。

そして、log関数にnumberを渡すことでlog(e)の値を計算し、その結果をprintf関数を用いて表示しています。

このコードを実行すると、「log(e)は 1.000000」と表示されます。

次に、log10関数の使用方法を見ていきましょう。

log10関数を使用したサンプルコードを紹介します。

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

int main() {
    double number = 100.0;  // 10の2乗
    printf("log10(100)は %f\n", log10(number));
    return 0;
}

このコードでは、まず、10の2乗である100をdouble型の変数numberに格納しています。

その後、log10関数にnumberを渡すことで、log10(100)の値を計算し、その結果をprintf関数を用いて表示しています。

このコードを実行すると、「log10(100)は 2.000000」と表示されます。

●math.hの詳細な対処法と注意点

math.hライブラリを使用する際の注意点とその対処法について詳しく見ていきましょう。

初心者の方々にも分かりやすく解説していきますので、C言語のプログラミングに役立ててください。

まず最初に、math.hライブラリの関数は、引数や返り値の型に注意が必要です。

多くの関数は引数にdouble型を要求します。整数を直接引数にすると、予期せぬ結果を招くことがあります。

そのため、引数にはdouble型の数値を渡すようにしましょう。

具体的には次のようなコードになります。

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

int main() {
    double number = 5.0;
    printf("sqrt(5.0)は %f\n", sqrt(number));
    return 0;
}

このコードでは、5.0(double型)の平方根を計算するsqrt関数を使っています。

こうすることで、整数を直接渡すときに生じる問題を避けることができます。

次に、math.hライブラリの関数の引数に不適切な値が与えられた場合のエラーハンドリングについて説明します。

たとえば、負の数値の平方根を求めるsqrt関数を呼び出すと、NaN(Not a Number)という特殊な値が返ります。

これを防ぐには、関数に適切な引数が渡されることを確認するためのエラーチェックを追加することが推奨されます。

具体的には次のようなコードになります。

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

int main() {
    double number = -5.0;
    if (number >= 0) {
        printf("sqrt(-5.0)は %f\n", sqrt(number));
    } else {
        printf("エラー: sqrtの引数は0以上でなければなりません。\n");
    }
    return 0;
}

このコードでは、sqrt関数に渡す値が0以上であることをif文でチェックしています。

そうでない場合、エラーメッセージを表示します。

これにより、不適切な引数を渡した際の問題を事前に避けることができます。

●math.hのカスタマイズ方法

C言語のmath.hライブラリをカスタマイズする方法について詳しく解説していきます。

math.hに存在しない特定の数学的処理を必要とする場合、自身で関数を作成して追加することが可能です。

ここでは、関数の新規作成と追加方法を学びましょう。

○関数の新規作成と追加方法

新規の関数を作成する際には、まずは関数のプロトタイプ宣言を行い、次にその関数の具体的な挙動を定義します。

ここでは、2つの数値の平均値を求める平均関数を作成してみましょう。

この関数では、2つのdouble型の引数を取り、その平均値をdouble型で返します。

#include <stdio.h>

// 平均関数のプロトタイプ宣言
double average(double a, double b);

int main() {
    double num1 = 5.0, num2 = 3.0;
    printf("%fと%fの平均値は%fです。\n", num1, num2, average(num1, num2));
    return 0;
}

// 平均関数の定義
double average(double a, double b) {
    return (a + b) / 2.0;
}

このコードでは、averageという新しい関数を作成し、2つのdouble型の引数を取り、その平均値を返しています。

この例では、5.0と3.0の平均値を計算しています。

このように、必要な処理がmath.hライブラリに存在しない場合には、自身で新しい関数を作成することで対応することが可能です。

このようなカスタム関数を使用することで、自身のプログラムに特化した数学的処理を柔軟に実現することができます。

ただし、関数を作成する際にはその処理の複雑さやパフォーマンスへの影響を考慮する必要があります。

また、関数の名前は他のライブラリとの衝突を避けるために、ユニークで誤解を招かないものを選ぶと良いでしょう。

●応用例とサンプルコード

C言語のmath.hライブラリは多くの応用例を持ちます。

その中からいくつかを選び、サンプルコードと共に解説していきます。

○数学問題の解決

math.hライブラリは、数学問題を解決する上で非常に便利なツールとなります。

例えば、二次方程式の解を求めるプログラムを作成することができます。

下記のコードは、二次方程式の解を求める一例です。

このコードでは、sqrt関数を使って平方根を計算し、その結果を使って二次方程式の解を求めています。

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

int main() {
    double a = 1.0, b = -3.0, c = 2.0;
    double D = b * b - 4 * a * c;
    if (D < 0) {
        printf("実数解が存在しません。\n");
    } else {
        double x1 = (-b + sqrt(D)) / (2 * a);
        double x2 = (-b - sqrt(D)) / (2 * a);
        printf("解は%fと%fです。\n", x1, x2);
    }
    return 0;
}

このコードでは、まず判別式Dを計算しています。

判別式Dが0未満の場合は実数解が存在しないので、その旨を表示します。

それ以外の場合は、sqrt関数を用いて判別式Dの平方根を求め、それを使って二次方程式の解を計算しています。

この例では、二次方程式x^2 - 3x + 2 = 0の解を求めています。

○ゲームプログラミングの具体例

また、math.hライブラリはゲームプログラミングの中でも頻繁に使用されます。

例えば、角度をラジアンに変換して、物体の動きを制御するケースがあります。

以下のコードは、度数法から弧度法(ラジアン)に変換する例です。

このコードでは、sin関数とcos関数を使用して、45度の角度におけるsinとcosの値を計算しています。

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

int main() {
    double degree = 45.0;
    double radian = degree * M_PI / 180.0;
    printf("角度%f度のsinは%fで、cosは%fです。\n", degree, sin(radian), cos(radian));
    return 0;
}

このコードでは、角度45度を弧度法に変換し、その結果をsin関数とcos関数に渡して、sinとcosの値を計算しています。

ゲームプログラミングでは、このように角度からsinやcosの値を得て、物体の動きを制御します。

まとめ

C言語のmath.hライブラリは、さまざまな数学的な計算を行うための関数を提供しています。

本記事では、math.hの基本的な機能から、具体的な使用方法、注意点、カスタマイズ方法までを詳しく解説しました。

「fabs」関数、「ceil」関数、「floor」関数、「sqrt」関数、「pow」関数、「sin」、「cos」、「tan」関数、「log」、「log10」関数など、様々な関数が提供されており、それぞれの関数の使用方法とサンプルコードを通じてその具体的な使用例を学びました。

また、関数の新規作成や追加方法を学び、math.hライブラリをカスタマイズすることにより、更に多様な数学的な計算が可能となることを理解しました。

そして、数学問題の解決やゲームプログラミングの具体例を通じて、実際の応用例を見てきました。

特にゲームプログラミングでは角度をラジアンに変換することで、物体の動きを制御することが可能であり、これもmath.hライブラリの機能を活用した一例です。

以上の学習を通じて、C言語のmath.hライブラリは非常に強力であり、その使用法を理解することで、プログラミングにおける表現力を大きく広げることができるということを理解していただければと思います。

これからもmath.hライブラリを活用し、さまざまなプログラムを作成していくことで、その力をさらに体感していただければと思います。

最後まで読んでいただき、ありがとうございました。