C言語の円周率πの使い方【M_PIを使ったサンプルも掲載】
目次
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_PI
、2
をπで割った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
の中でdefine
でM_PI
を自力で定義し、endif
でif
文を終わらせます。
このようにすることで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 ・) | すげーネーミングセンスだ |