我想在一些c++程序中使用PI常数和三角函数。我得到三角函数包含<math。h>。然而,在这个头文件中似乎没有PI的定义。
如何获得PI而不手动定义它?
我想在一些c++程序中使用PI常数和三角函数。我得到三角函数包含<math。h>。然而,在这个头文件中似乎没有PI的定义。
如何获得PI而不手动定义它?
当前回答
你可以这样做:
#include <cmath>
#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif
如果M_PI已经在cmath中定义,那么除了包含cmath之外,它不会做任何其他事情。如果M_PI没有定义(在Visual Studio中就是这种情况),它会定义它。在这两种情况下,都可以使用M_PI来获取pi的值。
这个圆周率值来自Qt Creator的qmath.h。
其他回答
我通常更喜欢自己定义:const double PI = 2*acos(0.0);因为不是所有的实现都为您提供它。
这个函数是在运行时被调用还是在编译时被静态输出的问题通常不是问题,因为它只会发生一次。
我在项目中使用了一个覆盖所有基础的公共头文件:
#define _USE_MATH_DEFINES
#include <cmath>
#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif
#ifndef M_PIl
#define M_PIl (3.14159265358979323846264338327950288)
#endif
另外,如果包含<cmath>,下面所有的编译器都定义了M_PI和M_PIl常量。不需要添加只有vc++才需要的#define _use_math_definitions。
x86 GCC 4.4+
ARM GCC 4.5+
x86 Clang 3.0+
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;
}
你可以这样做:
#include <cmath>
#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif
如果M_PI已经在cmath中定义,那么除了包含cmath之外,它不会做任何其他事情。如果M_PI没有定义(在Visual Studio中就是这种情况),它会定义它。在这两种情况下,都可以使用M_PI来获取pi的值。
这个圆周率值来自Qt Creator的qmath.h。
我刚刚看到了Danny Kalev写的一篇文章,它为c++ 14及以上版本提供了一个很好的建议。
template<typename T>
constexpr T pi = T(3.1415926535897932385);
我认为这非常酷(尽管我会在其中使用最高精度的PI),特别是因为模板可以基于类型使用它。
template<typename T>
T circular_area(T r) {
return pi<T> * r * r;
}
double darea= circular_area(5.5);//uses pi<double>
float farea= circular_area(5.5f);//uses pi<float>