CとC++では、piという数にかなり愚かな問題があります。私の知る限りでは、M_PI
で定義されているmath.h
はどの規格でも必要とされていません。
新しいC++標準は、標準ライブラリに多くの複雑な数学を導入しました - 双曲線関数、std::hermite
とstd::cyl_bessel_i
、異なる乱数ジェネレータなど。
「新しい」標準のどれかがpiに定数をもたらしましたか?そうでない場合 - なぜですか?この複雑な数学はすべて、それなしではどのように機能するのでしょうか。
私は、C++でのpiについても同様の質問を知っています(それらは数年で標準的なものです)。問題の現状を知りたいのですが。
私はなぜなのか C++にもまだ関心がありますが、それでもpi定数はありませんが、もっと複雑な数学がたくさんあります。
UPD:私は自分自身でpiを4 * atan(1)もしくはacos(1)もしくはdouble pi = 3.14と定義できることを知っています。もちろんです。しかし、なぜ2018年に私はまだそれをしなければならないのですか?標準的な数学関数は円周率なしでどのように機能しますか?
いいえ、 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/ を参照してください。
他の人が言ったようにstd::pi
はありませんが、正確なPI
値が欲しいならあなたは使うことができます:
constexpr double pi = std::acos(-1);
これはあなたのC++インプリメンテーションがacos(-1.0)
、 これは一般的ですが保証されていません から正しく丸められた値のPIを生成すると仮定します。
これはconstexpr
ではありませんが、実際にはgccやclangのような最適化コンパイラはコンパイル時にそれを評価します。ただし、const
と宣言することは、オプティマイザが良い仕事をするために重要です。
M_PI
は、X/Open System Interfaces拡張子の付いた言語 standard: POSIX でない場合、「標準」で定義されます(これは非常に一般的にサポートされており、公式のUNIXブランドで必要です)。
C++ 20がどうなるかは(まだ)定かではありませんが、尋ねたときからはおそらく そのような定数があるでしょう 。 Library Evolutionは、2018年11月に以前のバージョンの論文(名前空間と変数テンプレート付き)を承認し、2019年8月にCommittee Draftに掲載される可能性があります。
ドメインを越えて普遍的に適用可能であるpiを定義する明白なタイプがないので、それは明らかに良い考えではありません。
Piはもちろん無理数なので、 any C++型では正しく表現できません。したがって、自然なアプローチは、利用可能な最大の浮動小数点型で定義することです。ただし、最大の標準浮動小数点型long double
のサイズはC++標準では定義されていないため、定数の値はシステムによって異なります。さらに悪いことに、ワーキングタイプがこの最大タイプではなかったプログラムでは、piを定義するのは不適切です。なぜなら、piを使用するたびにパフォーマンスコストがかかるからです。
Piの値を見つけて、使用に適した独自の定数を定義することもプログラマーにとっては自明なことです。したがって、それを数学ヘッダーに含めることに大きな利点はありません。