web-dev-qa-db-ja.com

C++ 11、14、17または20はpiの標準定数を導入していますか?

CとC++では、piという数にかなり愚かな問題があります。私の知る限りでは、M_PIで定義されているmath.hはどの規格でも必要とされていません。

新しいC++標準は、標準ライブラリに多くの複雑な数学を導入しました - 双曲線関数、std::hermitestd::cyl_bessel_i、異なる乱数ジェネレータなど。

「新しい」標準のどれかがpiに定数をもたらしましたか?そうでない場合 - なぜですか?この複雑な数学はすべて、それなしではどのように機能するのでしょうか。

私は、C++でのpiについても同様の質問を知っています(それらは数年で標準的なものです)。問題の現状を知りたいのですが。

私はなぜなのか C++にもまだ関心がありますが、それでもpi定数はありませんが、もっと複雑な数学がたくさんあります。

UPD:私は自分自身でpiを4 * atan(1)もしくはacos(1)もしくはdouble pi = 3.14と定義できることを知っています。もちろんです。しかし、なぜ2018年に私はまだそれをしなければならないのですか?標準的な数学関数は円周率なしでどのように機能しますか?

151
Amomum

いいえ、 pi はまだ言語に導入されている定数ではありません、そしてそれは首の痛みです。

私はBoost(www.boost.org)を使っていて、128ビットのlong doubleに対しても十分に多数の小数点以下の桁数で pi を定義しているのは幸いです。

Boostを使わないのなら、それを自分でハードコーディングしてください。それを三角関数で定義するのは魅力的ですが、そうしてしまうとconstexprにすることはできません。三角関数の正確さは私が知っている( cf std::sqrt)標準によっても保証されていないので、本当にあなたは本当にそのような関数に頼っている危険な地面にいます。

メタプログラミングを使用して pi constexpr値を取得する方法があります。 http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/ を参照してください。

94
Bathsheba

いいえ、標準のどれもが 数pi (π)を表す定数を導入していません。あなたのコードの数を概算することができます:

constexpr double pi = 3.14159265358979323846;

C#のような他の言語は 持っている それらのライブラリで宣言された定数。 C++は違います。

32
Ron

他の人が言ったようにstd::piはありませんが、正確なPI値が欲しいならあなたは使うことができます:

constexpr double pi = std::acos(-1);

これはあなたのC++インプリメンテーションがacos(-1.0)これは一般的ですが保証されていません から正しく丸められた値のPIを生成すると仮定します。

これはconstexprではありませんが、実際にはgccやclangのような最適化コンパイラはコンパイル時にそれを評価します。ただし、constと宣言することは、オプティマイザが良い仕事をするために重要です。

29
0x476f72616e

M_PIは、X/Open System Interfaces拡張子の付いた言語 standard: POSIX でない場合、「標準」で定義されます(これは非常に一般的にサポートされており、公式のUNIXブランドで必要です)。

C++ 20がどうなるかは(まだ)定かではありませんが、尋ねたときからはおそらく そのような定数があるでしょう 。 Library Evolutionは、2018年11月に以前のバージョンの論文(名前空間と変数テンプレート付き)を承認し、2019年8月にCommittee Draftに掲載される可能性があります。

23
Davis Herring

ドメインを越えて普遍的に適用可能であるpiを定義する明白なタイプがないので、それは明らかに良い考えではありません。

Piはもちろん無理数なので、 any C++型では正しく表現できません。したがって、自然なアプローチは、利用可能な最大の浮動小数点型で定義することです。ただし、最大の標準浮動小数点型long doubleのサイズはC++標準では定義されていないため、定数の値はシステムによって異なります。さらに悪いことに、ワーキングタイプがこの最大タイプではなかったプログラムでは、piを定義するのは不適切です。なぜなら、piを使用するたびにパフォーマンスコストがかかるからです。

Piの値を見つけて、使用に適した独自の定数を定義することもプログラマーにとっては自明なことです。したがって、それを数学ヘッダーに含めることに大きな利点はありません。

13
Jack Aidley