我想在一些c++程序中使用PI常数和三角函数。我得到三角函数包含<math。h>。然而,在这个头文件中似乎没有PI的定义。
如何获得PI而不手动定义它?
我想在一些c++程序中使用PI常数和三角函数。我得到三角函数包含<math。h>。然而,在这个头文件中似乎没有PI的定义。
如何获得PI而不手动定义它?
当前回答
在c++ 20标准库中,π被定义为std::numbers::pi_v,用于浮点数、双精度数和长双精度数。
#include <numbers>
auto n = std::numbers::pi_v<float>;
并且可以专门化为用户定义的类型。
其他回答
在一些(特别是旧的)平台上(参见下面的评论),您可能需要这样做
#define _USE_MATH_DEFINES
然后包含必要的头文件:
#include <math.h>
PI的值可以通过:
M_PI
在我的math.h(2014)中,它被定义为:
# define M_PI 3.14159265358979323846 /* pi */
但请检查math.h以获得更多信息。摘自“旧”math.h(2009年):
/* Define _USE_MATH_DEFINES before including math.h to expose these macro
* definitions for common math constants. These are placed under an #ifdef
* since these commonly-defined names are not part of the C/C++ standards.
*/
然而:
在更新的平台上(至少在我的64位Ubuntu 14.04上),我不需要定义_use_math_definitions 在(最近的)Linux平台上,GNU扩展也提供了长double值: #定义M_PIl 3.141592653589793238462643383279502884L /* pi */
你也可以使用boost,它为所请求的类型定义了最精确的重要数学常数(例如float vs double)。
const double pi = boost::math::constants::pi<double>();
查看boost文档以获得更多示例。
M_PI, M_PI_2, M_PI_4等值不是标准的c++,因此constexpr似乎是更好的解决方案。不同的const表达式可以计算相同的pi,它关心我是否他们(所有)提供了完整的精度。c++标准没有明确提到如何计算圆周率。因此,我倾向于手动定义圆周率。我想分享下面的解决方案,它支持圆周率的所有分数的完全准确。
#include <ratio>
#include <iostream>
template<typename RATIO>
constexpr double dpipart()
{
long double const pi = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899863;
return static_cast<double>(pi * RATIO::num / RATIO::den);
}
int main()
{
std::cout << dpipart<std::ratio<-1, 6>>() << std::endl;
}
我建议你只输入你需要的精度。这不会为您的执行增加计算时间,并且无需使用任何头文件或#define即可移植。计算acos或atan总是比使用预先计算的值更昂贵。
const double PI =3.141592653589793238463;
const float PI_F=3.14159265358979f;
我从大学(也许是高中)就开始背圆周率到11位,所以这一直是我的首选方法:
#ifndef PI
#define PI 3.14159265359
#endif