我想在一些c++程序中使用PI常数和三角函数。我得到三角函数包含<math。h>。然而,在这个头文件中似乎没有PI的定义。
如何获得PI而不手动定义它?
我想在一些c++程序中使用PI常数和三角函数。我得到三角函数包含<math。h>。然而,在这个头文件中似乎没有PI的定义。
如何获得PI而不手动定义它?
当前回答
标准c++没有圆周率的常数。
许多c++编译器在cmath中定义M_PI(或在math.h中定义C)作为一个非标准扩展。在看到它之前,您可能必须#define _use_math_definitions。
其他回答
在一些(特别是旧的)平台上(参见下面的评论),您可能需要这样做
#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 */
我不喜欢#定义,因为它们是零类型安全的简单文本替换。如果省略括号,它们也会在使用表达式时引起问题。
#define T_PI 2*PI
真的应该
#define T_PI (2*PI)
我目前对这个问题的解决方案是使用常量的硬编码值,例如my_constants.hxx
namespace Constants {
constexpr double PI = 3.141... ;
}
但是我没有硬编码这些值(因为我也不喜欢这种方法),而是使用一个单独的Fortran程序来编写这个文件。我使用Fortran是因为它完全支持四精度(VisualStudio上的c++不支持),三角函数是c++的constexpr等价函数。 如。
real(8), parameter :: pi = 4*atan(1.0d0)
毫无疑问,其他语言也可以用来做同样的事情。
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;
}
我从大学(也许是高中)就开始背圆周率到11位,所以这一直是我的首选方法:
#ifndef PI
#define PI 3.14159265359
#endif
标准c++没有圆周率的常数。
许多c++编译器在cmath中定义M_PI(或在math.h中定义C)作为一个非标准扩展。在看到它之前,您可能必须#define _use_math_definitions。