1

私は新しいプロジェクトに取り組んでおり、できる限りクリーンで読みやすく、できれば最も効率的なコードを書こうとしています。

PI を使用する必要がありますが、明らかに math.h で定義されていません。だから私はこれを行うことについて読んだ:

const double PI = atan(1.0)*4

しかし、私はこのエラーが発生します:

関数呼び出しは定数式に表示できません

理由についてのアイデアはありますか?どうすれば PI を定数として取得できますか?

また、このプロジェクトでできる限り多くのことを学ぼうとしているので、答えがうまくいく理由も説明していただければ幸いです. ありがとう!

4

4 に答える 4

7

どうですか:

const double PI = 3.1415926535897932384626433832795028841971693993751058209;

これは、よりもクリーンで読みやすく、効率的であるように私には思えますatan(1.0)*4

于 2012-01-27T21:54:04.247 に答える
5

質問のタグ付けが間違っています。C++ では、以下が明確に定義されており、コンパイルされます。

#include <math.h>

const double PI = atan(1.0)*4;

しかし C では、ファイル スコープでのイニシャライザは許可されていません。

C では、非標準マクロ ( M_PIGCC など) を使用するか、独自の適切なマクロまたはリテラルを作成するか ( Ned Batchelder が難しい部分を行ってくれました)、独自の関数で適切に初期化する必要があります。十分に早い時間。

于 2012-01-27T21:56:51.143 に答える
2
#include <math.h>

const double PI = M_PI;

const doubleコンパイル時に定数を評価する必要があるため、グローバルの関数を呼び出すことはできません。実行時には何でもかまいatan()ません。起動時に 1 回呼び出されるように設定することもできますが、既に利用可能な実際の PI 定数を使用する方が適切です。

(実際にはM_PI直接使用することもできます)

編集:多くのコメントに賛成票を投じ、1年以上後に自分の回答を読み直して、定数に関する私の声明について人々が怒っている理由を確認しました。私はステップを飛び越えていました:const double実行時に簡単に初期化できると誰もが言っているようにdouble. ただし、 (定数式ではなく) グローバル変数を使用して pi を格納すると、最適化の機会が失われます。いくつかの実験でgccは、これは私が思っていたほど悪くないことが示唆されており、まったく新しい質問が示唆されています...

于 2012-01-27T21:45:37.343 に答える