我想在一些c++程序中使用PI常数和三角函数。我得到三角函数包含<math。h>。然而,在这个头文件中似乎没有PI的定义。
如何获得PI而不手动定义它?
我想在一些c++程序中使用PI常数和三角函数。我得到三角函数包含<math。h>。然而,在这个头文件中似乎没有PI的定义。
如何获得PI而不手动定义它?
当前回答
而不是写作
#define _USE_MATH_DEFINES
我建议使用- use_math_definitions或/ d_use_math_definitions,这取决于你的编译器。
通过这种方式,即使有人在您之前包含了头文件(并且没有使用#define),您仍然可以得到常量,而不是一个晦涩的编译器错误,您需要花费很长时间来查找。
其他回答
我通常更喜欢自己定义:const double PI = 2*acos(0.0);因为不是所有的实现都为您提供它。
这个函数是在运行时被调用还是在编译时被静态输出的问题通常不是问题,因为它只会发生一次。
我会这么做
template<typename T>
T const pi = std::acos(-T(1));
or
template<typename T>
T const pi = std::arg(-std::log(T(2)));
我不会把π输入到你需要的精度。这到底是什么意思?你需要的精度是T的精度,但是我们对T一无所知。
你可能会说:What are You talking about?T是float, double或long double。因此,只需输入long double的精度,即。
template<typename T>
T const pi = static_cast<T>(/* long double precision π */);
但是你真的知道在未来的标准中不会有比long double精度更高的新的浮点类型吗?你不。
这就是为什么第一个解很漂亮。可以肯定的是,这个标准将会使三角函数过载而产生一种新的类型。
请不要说三角函数在初始化时的计算是性能损失。
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;
}
Pi可计算为atan(1)*4。您可以这样计算值并缓存它。
我刚刚看到了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>