C ++ 11,14,17或20是否为pi引入标准常量?

时间:2018-04-11 14:49:40

标签: c++ c++11 c++14 language-lawyer c++17

C和C ++中的数字pi存在一个相当愚蠢的问题。据我所知M_PI中定义的math.h并非任何标准都要求。

新的C ++标准在标准库中引入了许多复杂的数学 - 双曲函数,std::hermitestd::cyl_bessel_i,不同的随机数生成器等等。

是否有任何新的' pi标准为pi带来了一席之地?如果没有 - 为什么?如果没有它,所有这些复杂的数学如何运作?

我知道关于C ++中pi的类似问题(它们已经有几年了,标准已经过去了);我想知道问题的当前状态。

我也非常感兴趣为什么为什么 C ++仍然没有pi常数但是有更复杂的数学。

UPD:我知道我可以将自己定义为4 * atan(1)或acos(1)或double pi = 3.14。当然。但为什么在2018年我仍然必须这样做?标准数学函数如何在没有pi的情况下工作?

6 个答案:

答案 0 :(得分:94)

不, pi 仍然没有引入该语言的常数,这是一个痛苦的问题。

我很幸运,因为我使用了Boost(www.boost.org),他们定义了 pi ,其中包含足够多的小数位,即使是128位long double。< / p>

如果您不使用Boost,请自行进行硬编码。使用三角函数定义它很有吸引力但是如果你这样做就不能使它成为constexpr。我所知道的任何标准( cf std::sqrt)也无法保证三角函数的准确性,所以你确实依赖于这样的函数而处于危险的境地。

使用元编程可以获得 pi constexpr值:请参阅http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/

答案 1 :(得分:32)

不,没有一个标准引入代表number pi(π)的常数。您可以在代码中估算出数字:

constexpr double pi = 3.14159265358979323846;

其他语言,例如C#have在其库中声明的常量。 C ++没有。

答案 2 :(得分:29)

正如其他人所说没有std::pi但是如果你想要精确的PI值,你可以使用:

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

这假设您的C ++实现从acos(-1.0)which is common but not guaranteed生成了一个正确舍入的PI值。

它不是constexpr,但在实践中,优化编译器(如gcc和clang)会在编译时对其进行评估。然而,声明它const对于优化器做好工作非常重要。

答案 3 :(得分:23)

M_PI由&#34;标准&#34;定义,如果不是语言标准:POSIX具有X / Open System Interfaces扩展名(即官方UNIX品牌非常普遍支持和需要。)

它(仍然)不确定C ++ 20中会有什么,但是因为你问:它可能会有such constants。图书馆进化在2018年11月批准了以前的版本文件(带有名称空间和可变模板),它可能出现在2019年8月的委员会草案中。

答案 4 :(得分:13)

这显然不是一个好主意,因为没有明显的类型可以定义跨域普遍适用的pi。

Pi当然是一个无理数,因此任何 C ++类型无法正确表示它。您可能会争辩说,自然方法是将其定义为可用的最大浮点类型。但是,最大标准浮点类型long double的大小不是由C ++标准定义的,因此常量的值会因系统而异。更糟糕的是,对于任何工作类型不是这种最大类型的程序,pi的定义是不合适的,因为它会对每次使用pi施加性能成本。

任何程序员找到pi的值并定义适合使用的常量也是微不足道的,因此将它包含在maths头中没有任何好处。

答案 5 :(得分:-2)

编辑 - 删除必要的术语,因为它证明是有争议的。这绝对是一个绝对的术语。

C ++是一种庞大而复杂的语言,因此标准委员会只包含强烈要求的内容。尽可能留给非语言标准库......比如Boost boost::math::constants