557

いくつかのC++プログラムでPI定数と三角関数を使用したいと思います。で三角関数を取得しinclude <math.h>ます。ただし、このヘッダーファイルにはPIの定義がないようです。

手動で定義せずにPIを取得するにはどうすればよいですか?

4

25 に答える 25

625

一部の(特に古い)プラットフォームでは(以下のコメントを参照)、

#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.
 */

でも:

  1. 新しいプラットフォーム(少なくとも64ビットのUbuntu 14.04)では、を定義する必要はありません。_USE_MATH_DEFINES

  2. (最近の)Linuxプラットフォームにはlong double、GNU拡張機能として提供されている値もあります。

    # define M_PIl          3.141592653589793238462643383279502884L /* pi */
    
于 2009-11-13T08:28:16.277 に答える
186

円周率は次のように計算できますatan(1)*4。この方法で値を計算し、キャッシュすることができます。

于 2009-11-13T08:26:27.617 に答える
119

要求された型 (つまり、float と double) に対して最大の精度で重要な数学定数を定義する boost を使用することもできます。

const double pi = boost::math::constants::pi<double>();

その他の例については、ブーストのドキュメントをご覧ください。

于 2009-11-13T12:33:29.547 に答える
52

必要な精度で pi を入力することをお勧めします。これにより、実行に計算時間が追加されず、ヘッダーや #defines を使用せずに移植できます。acos または atan の計算は、事前に計算された値を使用するよりも常にコストがかかります。

const double PI  =3.141592653589793238463;
const float  PI_F=3.14159265358979f;
于 2011-11-12T20:51:02.920 に答える
52

書くのではなく

#define _USE_MATH_DEFINES

-D_USE_MATH_DEFINESコンパイラを使用するか/D_USE_MATH_DEFINES、コンパイラに依存することをお勧めします。

このようにして、誰かがヘッダーをインクルードする前に (#define を使用せずに) ヘッダーをインクルードした場合でも、追跡するのに何年もかかるあいまいなコンパイラ エラーの代わりに定数を保持できることが保証されます。

于 2009-11-13T12:09:42.643 に答える
41

公式の標準ライブラリは定数 PI を定義していないため、自分で定義する必要があります。「手動で定義せずにPIを取得するにはどうすればよいですか?」という質問に対する答えです。「あなたはそうしません-または、いくつかのコンパイラ固有の拡張機能に依存しています。」. 移植性について心配していない場合は、コンパイラのマニュアルを確認してください。

C++ を使用すると、次のように記述できます

const double PI = std::atan(1.0)*4;

ただし、この定数の初期化は静的であるとは限りません。ただし、G++ コンパイラはこれらの数学関数を組み込み関数として処理し、コンパイル時にこの定数式を計算できます。

于 2009-11-13T08:37:38.200 に答える
34

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
于 2013-03-12T11:35:05.083 に答える
27

標準のC++には、PIの定数がありません。

多くのC++コンパイラはM_PI、in cmath(またはmath.hCの場合)を非標準の拡張機能として定義しています。あなたが#define _USE_MATH_DEFINESそれを見ることができる前にあなたはそうしなければならないかもしれません。

于 2009-11-13T08:27:24.283 に答える
13

すべてのベースをカバーするプロジェクトの共通ヘッダーの 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+
于 2016-05-28T11:42:10.693 に答える
8

私は通常、独自に定義することを好みconst double PI = 2*acos(0.0);ます。すべての実装でそれが提供されるわけではないためです。

この関数が実行時に呼び出されるのか、それともコンパイル時に静的に出力されるのかという問題は、いずれにしても 1 回しか発生しないため、通常は問題になりません。

于 2009-11-18T04:03:41.310 に答える
2

Windows (cygwin + g++) では、プリプロセッサがin-D_XOPEN_SOURCE=500の定義を処理するためのフラグを追加する必要があることがわかりました。M_PImath.h

于 2014-12-15T12:11:26.487 に答える
1

あなたはこれを行うことができます:

#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 から取得されます。

于 2016-11-09T11:53:14.773 に答える
1

C++14 でできることstatic constexpr auto pi = acos(-1);

于 2016-03-21T20:09:45.893 に答える