C 和 C++ 中的数字 pi 存在一个相当愚蠢的问题。据我所知,任何标准都不需要M_PI定义 in 。math.h
M_PI
math.h
新的 C++ 标准在标准库中引入了许多复杂的数学 - 双曲函数,std::hermite以及std::cyl_bessel_i不同的随机数生成器等等。
std::hermite
std::cyl_bessel_i
是否有任何“新”标准为 pi 带来了常数?如果不是 - 为什么?没有它,所有这些复杂的数学如何运作?
我知道关于 C++ 中 pi 的类似问题(它们已经有好几年了,而且标准已经老了);我想知道问题的当前状态。
我也对 为什么 C++ 仍然没有 pi 常数但有很多更复杂的数学很感兴趣。
我知道我可以将 pi 自己定义为4*atan(1)oracos(-1)或double pi = 3.14;。当然。但是我为什么还要这样做呢?没有 pi,标准数学函数如何工作?
4*atan(1)
acos(-1)
double pi = 3.14;
直到并包括 C++17 pi 并不是引入该语言的常量,它是一个令人头疼的问题。
我很幸运,因为我使用了boost并且他们为 pi 定义了足够多的小数位数,即使是 128 位long double。
long double
如果您不使用 Boost,请自行对其进行硬编码。用三角函数定义它很诱人,但如果你这样做,你就不能让它成为constexpr. 我所知道的任何标准(参见 )也不能保证三角函数的准确性std::sqrt,所以你确实处于危险的境地,确实依赖于这样的函数。
constexpr
std::sqrt
有一种使用元编程获取 piconstexpr值的方法:参见http://timmurphy.org/2013/06/27/template- metaprogramming-in-c/ __
来自 C20 的一些好消息。 pi 有 一个 定义。C20 在. 例如是一个类型。 __<numbers>``std::numbers::pi``double
<numbers>``std::numbers::pi``double
参考:https ://en.cppreference.com/w/cpp/numeric/constants