いくつかのC++プログラムでPI定数と三角関数を使用したいと思います。で三角関数を取得しinclude <math.h>
ます。ただし、このヘッダーファイルにはPIの定義がないようです。
手動で定義せずにPIを取得するにはどうすればよいですか?
いくつかのC++プログラムでPI定数と三角関数を使用したいと思います。で三角関数を取得しinclude <math.h>
ます。ただし、このヘッダーファイルにはPIの定義がないようです。
手動で定義せずにPIを取得するにはどうすればよいですか?
一部の(特に古い)プラットフォームでは(以下のコメントを参照)、
#define _USE_MATH_DEFINES
次に、必要なヘッダーファイルをインクルードします。
#include <math.h>
円周率の値には、次の方法でアクセスできます。
M_PI
私のmath.h
(2014)では、次のように定義されています。
# define M_PI 3.14159265358979323846 /* pi */
しかし、もっとチェックしてくださいmath.h
。「古い」からの抜粋math.h
(2009年):
/* Define _USE_MATH_DEFINES before including math.h to expose these macro
* definitions for common math constants. These are placed under an #ifdef
* since these commonly-defined names are not part of the C/C++ standards.
*/
でも:
新しいプラットフォーム(少なくとも64ビットのUbuntu 14.04)では、を定義する必要はありません。_USE_MATH_DEFINES
(最近の)Linuxプラットフォームにはlong double
、GNU拡張機能として提供されている値もあります。
# define M_PIl 3.141592653589793238462643383279502884L /* pi */
円周率は次のように計算できますatan(1)*4
。この方法で値を計算し、キャッシュすることができます。
要求された型 (つまり、float と double) に対して最大の精度で重要な数学定数を定義する boost を使用することもできます。
const double pi = boost::math::constants::pi<double>();
その他の例については、ブーストのドキュメントをご覧ください。
必要な精度で pi を入力することをお勧めします。これにより、実行に計算時間が追加されず、ヘッダーや #defines を使用せずに移植できます。acos または atan の計算は、事前に計算された値を使用するよりも常にコストがかかります。
const double PI =3.141592653589793238463;
const float PI_F=3.14159265358979f;
書くのではなく
#define _USE_MATH_DEFINES
-D_USE_MATH_DEFINES
コンパイラを使用するか/D_USE_MATH_DEFINES
、コンパイラに依存することをお勧めします。
このようにして、誰かがヘッダーをインクルードする前に (#define を使用せずに) ヘッダーをインクルードした場合でも、追跡するのに何年もかかるあいまいなコンパイラ エラーの代わりに定数を保持できることが保証されます。
公式の標準ライブラリは定数 PI を定義していないため、自分で定義する必要があります。「手動で定義せずにPIを取得するにはどうすればよいですか?」という質問に対する答えです。「あなたはそうしません-または、いくつかのコンパイラ固有の拡張機能に依存しています。」. 移植性について心配していない場合は、コンパイラのマニュアルを確認してください。
C++ を使用すると、次のように記述できます
const double PI = std::atan(1.0)*4;
ただし、この定数の初期化は静的であるとは限りません。ただし、G++ コンパイラはこれらの数学関数を組み込み関数として処理し、コンパイル時にこの定数式を計算できます。
math.hのPosix man ページから:
The <math.h> header shall provide for the following constants. The
values are of type double and are accurate within the precision of the
double type.
M_PI Value of pi
M_PI_2 Value of pi/2
M_PI_4 Value of pi/4
M_1_PI Value of 1/pi
M_2_PI Value of 2/pi
M_2_SQRTPI
Value of 2/ sqrt pi
標準のC++には、PIの定数がありません。
多くのC++コンパイラはM_PI
、in cmath
(またはmath.h
Cの場合)を非標準の拡張機能として定義しています。あなたが#define _USE_MATH_DEFINES
それを見ることができる前にあなたはそうしなければならないかもしれません。
すべてのベースをカバーするプロジェクトの共通ヘッダーの 1 つで、次を使用します。
#define _USE_MATH_DEFINES
#include <cmath>
#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif
#ifndef M_PIl
#define M_PIl (3.14159265358979323846264338327950288)
#endif
余談ですが、以下のすべてのコンパイラは、M_PI および M_PIl 定数を定義する場合、 を含めます<cmath>
。VC++ でのみ必要な #define _USE_MATH_DEFINES を追加する必要はありません。
x86 GCC 4.4+
ARM GCC 4.5+
x86 Clang 3.0+
私は通常、独自に定義することを好みconst double PI = 2*acos(0.0);
ます。すべての実装でそれが提供されるわけではないためです。
この関数が実行時に呼び出されるのか、それともコンパイル時に静的に出力されるのかという問題は、いずれにしても 1 回しか発生しないため、通常は問題になりません。
Windows (cygwin + g++) では、プリプロセッサがin-D_XOPEN_SOURCE=500
の定義を処理するためのフラグを追加する必要があることがわかりました。M_PI
math.h
あなたはこれを行うことができます:
#include <cmath>
#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif
M_PI
が ですでに定義されている場合cmath
、これは include 以外には何もしませんcmath
。が定義されていない場合M_PI
(たとえば、Visual Studio の場合)、定義されます。どちらの場合も、 を使用M_PI
して pi の値を取得できます。
この pi の値は、Qt Creator の qmath.h から取得されます。
C++14 でできることstatic constexpr auto pi = acos(-1);