C和C ++中的数字pi存在一个相当愚蠢的问题。据我所知M_PI
中定义的math.h
并非任何标准都要求。
新的C ++标准在标准库中引入了许多复杂的数学 - 双曲函数,std::hermite
和std::cyl_bessel_i
,不同的随机数生成器等等。
是否有任何新的' pi标准为pi带来了一席之地?如果没有 - 为什么?如果没有它,所有这些复杂的数学如何运作?
我知道关于C ++中pi的类似问题(它们已经有几年了,标准已经过去了);我想知道问题的当前状态。
我也非常感兴趣为什么为什么 C ++仍然没有pi常数但是有更复杂的数学。
UPD:我知道我可以将自己定义为4 * atan(1)或acos(1)或double pi = 3.14。当然。但为什么在2018年我仍然必须这样做?标准数学函数如何在没有pi的情况下工作?
答案 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