C言語の円周率πの使い方【M_PIを使ったサンプルも掲載】

599, 2022-12-09

目次

C言語で円周率を使う

C言語で円周率を使うにはM_PIという定数を使います。
この定数はmath.hをインクルードすると使えるようになる定数です。
M_PIには実数が定義されているので↓のようにprintf()などでその値を確認することができます。

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

int main(void) {
    printf("%lf\n", M_PI);  // 3.141593
    return 0;
}

M_PIの「M」は「Math」の「M」です。
PI」は円周率の「π(パイ)」を表しています。

M_PIの定義内容

GCCではmath.hをインクルードすると「/usr/include/math.h」が読み込まれます(環境によって変わります)。
このヘッダには↓のようにM_PIやその関連の定数が定義されています。

# define M_PI           3.14159265358979323846  /* pi */
# define M_PI_2         1.57079632679489661923  /* pi/2 */
# define M_PI_4         0.78539816339744830962  /* pi/4 */
# define M_1_PI         0.31830988618379067154  /* 1/pi */
# define M_2_PI         0.63661977236758134308  /* 2/pi */
# define M_2_SQRTPI     1.12837916709551257390  /* 2/sqrt(pi) */

M_PIの他にもπを半分にしたM_PI_2、それからπを4分割したM_PI_4もあります。
他には1をπで割ったM_1_PI2をπで割ったM_2_PIもあります。
2をπの平方根で割ったM_2_SQRTPIもあります。

これらの定数はよく使われるのであらかじめこのように定義されています。

VC++でM_PIを使う場合

VC++などを使っている場合はM_PIの使用には注意が必要です。
VC++ではM_PIを使いたい場合はmath.hをインクルードする前に

  • _USE_MATH_DEFINES

defineしておく必要があります。
math.hをインクルードしてM_PIを使ったのにエラーが出る場合は、コンパイラ依存のエラーを疑ってみてください。

#include <stdio.h>

#define _USE_MATH_DEFINES  /* このマクロを定義しておく */
#include <math.h>  /* M_PIが定義されているヘッダーファイル */

int main(void) {
    printf("%lf\n", M_PI);
    return 0;
}

自力でM_PIを定義する方法

何らかの理由でmath.hをインクルードできない場合は自力でM_PIを定義することもできます。

#include <stdio.h>

#ifndef M_PI
# define M_PI 3.141593
#endif

int main(void) {
    printf("%lf\n", M_PI);  // 3.141593
    return 0;
}

ifndefは「もし〇〇のマクロが定義されていなかったら真」というプリプロセスのif文です。
この場合は「もしM_PIが定義されていなかったら真」という意味になります。
ifndefの中でdefineM_PIを自力で定義し、endifif文を終わらせます。

このようにすることでmath.hがない環境でもM_PIを使えるようになります。

円周率とはなにか?

ここまで円周率を当たり前のように使ってきましたが、果たしてこの円周率とはいったい何なのでしょうか?
おさらいも含めてここで解説します。

円周率とは円の直径に対する円周の比率のことをいいます。
つまり円周率「3.14」とは「円の直径が3個並んでちょっとだけはみ出てる」という状態です。

この円周率は数学では最も重要な定数とも呼ばれていて、数学をやるとこの円周率は当たり前のように使います。
また円周率は度数法と弧度法の相互変換でも使われるのでゲーム開発などでもおなじみの定数です。

円周率は循環せず無理数で、延々と続いていきます。
よく円周率を暗記して暗唱してる人がいますが、このように円周率は数学者に愛される定数と言えます。

円周率を使ったプログラムは?

では円周率を使ったプログラムをいくつか紹介したいと思います。
紹介するのは

  • 角度をラディアンに変換する関数

  • ラディアンから単位円上の座標を求める

の2つです。

角度をラディアンに変換する関数

角度をラディアンに変換する関数deg_to_rad()です。

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

double deg_to_rad(double deg) {
    return deg * M_PI / 180.0;
}

int main(void) {
    printf("%lf\n", deg_to_rad(0));  // 0.000000
    printf("%lf\n", deg_to_rad(90));  // 1.570796
    printf("%lf\n", deg_to_rad(180));  // 3.141593
    return 0;
}

ラディアンとは弧度法の単位になります。
45度とか90度は度数法の単位です。
この度数法の単位を弧度法のラディアンという単位に変換するのがdeg_to_rad()関数です。

弧度法ではM_PIの値はちょうど度数法で言う180度になります。
ですのでM_PIを180で割ると1度についてのラディアンの量が求まります。
この1度についてのラディアンの量にdegをかけることでdegに含まれるラディアンの総量が求まります。
総量が求まったら単位変換は完了です。

ラディアンから単位円上の座標を求める

角度からラディアンが求めることが出来るようになると、三角関数で単位円上の座標を求めることができます。

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

double deg_to_rad(double deg) {
    return deg * M_PI / 180.0;
}

int main(void) {
    double rad = deg_to_rad(90);  // 90度のラディアンを求める
    double x = cos(rad);  // ラディアンから単位円上のX座標を求める
    double y = sin(rad);  // ラディアンから単位円上のY座標を求める
    printf("%lf %lf\n", x, y);  // 0.000000 1.000000

    return 0;
}

「単位円」とは半径が「1」の円のことです。
三角関数のcos()sin()にラディアンを渡すと単位円上のX座標とY座標が求まります。

この処理を行うと角度から円周上の座標を求めることができます。
もとまった座標にボリュームを掛ければ(たとえばx * 100とか)円の大きさは自由自在に決めることができます。
ゲーム開発などで大砲の砲身の傾きの角度から砲身の先の座標を求めたい時などに使えます。

このようにM_PIを使って応用していくとかなりいろいろな処理が書けるようになります。
便利ですね。

おわりに

今回はC言語で円周率を使う方法について解説しました。
円周率をマスターしておけばゲーム開発やグラフィカルな絵の処理にも使うことができます。
覚えておいて損はないですね。

(^ _ ^)

パイという響き

(・ v ・)

すげーネーミングセンスだ



この記事のアンケートを送信する