このページでは、C言語
で円周率 π を扱う方法について解説していきます。
math.h
をインクルードして M_PI
を使う
おそらく多くの環境では、円周率は math.h
で M_PI
で定義されているはずです。
例えば私の環境では、math.h
に下記のように M_PI
が定義されています。
#define M_PI 3.14159265358979323846264338327950288 /* pi */
ですので円周率を扱うのであれば、下記のように math.h
をインクルードしてから、M_PI
を円周率 π として扱えば良いです。
#include <stdio.h>
#include <math.h> /* M_PIが定義されている */
int main(void) {
printf("%f\n", M_PI); /* M_PIは円周率として扱われる */
return 0;
}
M_PI
使用時の注意点
下記のページにも記載されているとおり、VC++ などを使用している場合は、math.h
をインクルードする前に _USE_MATH_DEFINES
を #define
してやる必要がある場合もあるようです。
https://hayakute.kantan-sakusaku.com/?p=2235
なので、math.h
をインクルードしたのに “M_PI
が定義されていない” みたいなコンパイルエラーが出る場合は、下記のように _USE_MATH_DEFINES
を定義するようにしてやれば解決するかもしれないです。
#define _USE_MATH_DEFINES
#include <stdio.h>
#include <math.h> /* M_PIが定義されている */
int main(void) {
printf("%f\n", M_PI); /* M_PIは円周率として扱われる */
return 0;
}
上記のように、使用するコンパイラ等によっては math.h
に M_PI
が定義されていない場合があります。つまり M_PI
が定義されているかどうかは処理系依存です(標準規格で M_PI
を用意しなければならないと決まっていない)。
どんな環境で M_PI
が定義されていないかどうかまではちょっと分からないですが、あなたが作成したソースコードで M_PI
を使用している場合、もしかしたらそのソースコードは他の人の環境では M_PI
の定義が不足していてコンパイルに失敗するような可能性があるということになります。
なので下のような状況になりかねない…。
君がくれたソースコード、
コンパイルできないんだけど…
僕の環境だけどコンパイルできるのに、
おかしいなぁ…
もちろん自身の環境でしか実行しないようなプログラムのソースコードであれば、M_PI
が使えるのであればそのまま使ってしまっても良いです。
ただ、上記のように他の人がコンパイルすることも考慮し、どの環境でも M_PI
を使用できるようにするためには、下記のように M_PI
が定義されていない場合のみ M_PI
を定義してやるような記述を加えておくと無難だと思います。
#include <stdio.h>
#include <math.h> /* M_PIが定義されている */
#ifndef M_PI
/* M_PIが未定義であればここで定義する */
#define M_PI 3.14159 /* 桁数はもっと多い方がいいかも */
#endif
int main(void) {
printf("%f\n", M_PI); /* M_PIは円周率として扱われる */
return 0;
}
#ifndef M_PI
〜 #endif
の部分は M_PI
の定義が見つからない場合のみに有効になります。
ですので、もし M_PI
が定義されていない環境でコンパイルされた場合は、この部分で M_PI
が定義され、以降で M_PI
が使用できるようになります。
もし math.h
に M_PI
が定義されている環境であれば、#ifndef M_PI
〜 #endif
の部分は無効化されるので、そのまま math.h
の M_PI
が使用されることになります。
こういった処理系依存の問題への対策には #ifndef
(#ifdef
も)は便利なので是非覚えておいてください。
スポンサーリンク
まとめ
このページでは、C言語で円周率を扱う方法について解説しました!
多くの環境では math.h
で M_PI
が定義されているので、まずはこれを使用するので良いと思います。
ただ、全ての環境で math.h
に M_PI
が定義されているというわけではないので、この点には注意してください。
今回は既に定義されている円周率の値を使用する方法について解説しましたが、個人で円周率を使ったプログラムの動作確認をしたい場合などは、円周率の値を調べて下記のように自身で定義してやるのでも良いと思います!
#define PI 3.14159
オススメの参考書(PR)
C言語学習中だけど分からないことが多くて挫折しそう...という方には、下記の「スッキリわかるC言語入門」がオススメです!
まず学習を進める上で、参考書は2冊持っておくことをオススメします。この理由は下記の2つです。
- 参考書によって、解説の仕方は異なる
- 読み手によって、理解しやすい解説の仕方は異なる
ある人の説明聞いても理解できなかったけど、他の人からちょっと違った観点での説明を聞いて「あー、そういうことね!」って簡単に理解できた経験をお持ちの方も多いのではないでしょうか?
それと同じで、1冊の参考書を読んで理解できない事も、他の参考書とは異なる内容の解説を読むことで理解できる可能性があります。
なので、参考書は2冊持っておいた方が学習時に挫折しにくいというのが私の考えです。
特に上記の「スッキリわかるC言語入門」は、他の参考書とは違った切り口での解説が豊富で、他の参考書で理解できなかった内容に対して違った観点での解説を読むことができ、オススメです。題名の通り「なぜそうなるのか?」がスッキリ理解できるような解説内容にもなっており、C言語入門書としてもかなり分かりやすい参考書だと思います。
もちろんネット等でも色んな観点からの解説を読むことが出来ますので、分からない点は別の人・別の参考書の解説を読んで解決していきましょう!もちろん私のサイトも参考にしていただけると嬉しいです!
入門用のオススメ参考書は下記ページでも紹介していますので、こちらも是非参考にしていただければと思います。
https://daeudaeu.com/c_reference_book/