Amo*_*mum 161 c++ language-lawyer c++11 c++14 c++17
C和C++中的数字pi存在一个相当愚蠢的问题.据我知道M_PI
的定义math.h
是没有任何标准要求.
新的C++标准在标准库中引入了许多复杂的数学 - 双曲函数,std::hermite
以及std::cyl_bessel_i
不同的随机数生成器等等.
是否有任何"新"标准为pi带来了一个常数?如果没有 - 为什么?没有它,所有这些复杂的数学如何运作?
我知道关于C++中pi的类似问题(它们已经有几年了,而且标准已经很久了); 我想知道问题的当前状态.
我也非常感兴趣为什么 C++仍然没有pi常量,但有很多更复杂的数学.
UPD:我知道我可以将自己定义为4*atan(1)或acos(1)或double pi = 3.14.当然.但为什么在2018年我仍然必须这样做?没有pi,标准数学函数如何工作?
Bat*_*eba 94
不,pi仍然没有引入语言,这是一个痛苦的问题.
我很幸运,因为我使用了Boost(www.boost.org),他们定义的pi具有足够大的小数位数,即使是128位也是如此long double
.
如果您不使用Boost,请自行进行硬编码.用三角函数定义它很有吸引力,但如果你这样做,你就不能把它变成一个constexpr
.三角函数的精度也不会被我知道(任何标准保证的比照.std::sqrt
),所以真正你在危险的地面确实依赖于这样的功能.
有一种方法可以使用元编程constexpr
获得pi的值:请参阅http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/
Ron*_*Ron 31
不,没有一个标准引入代表数字pi(π)的常数.您可以在代码中估算数字:
constexpr double pi = 3.14159265358979323846;
Run Code Online (Sandbox Code Playgroud)
如C#等语言都在自己的音乐库中声明的常数.C++没有.
0x4*_*16e 29
正如其他人所说,没有,std::pi
但如果你想要精确的PI
价值,你可以使用:
constexpr double pi = std::acos(-1);
Run Code Online (Sandbox Code Playgroud)
这假设您的C++实现产生了一个正确舍入的PI值acos(-1.0)
,这是常见但不保证.
constexpr
事实并非如此,但在实践中,优化编译器(如gcc和clang)会在编译时对其进行评估.然而,声明const
对优化器做好工作很重要.
Jac*_*ley 13
这显然不是一个好主意,因为没有明显的类型可以定义跨域通用的pi.
当然,Pi是一个无理数,所以它不能被任何 C++类型正确表示.您可能会争辩说,自然方法是将其定义为可用的最大浮点类型.但是,最大标准浮点类型的long double
大小不是由C++标准定义的,因此常量的值会因系统而异.更糟糕的是,对于任何工作类型不是这种最大类型的程序,pi的定义是不合适的,因为它会对每次使用pi施加性能成本.
对于任何程序员来说,找到pi的值并定义适合使用的常量也是微不足道的,因此将它包含在maths头中并没有任何好处.