如何在 C++ 中使用 PI 常数
本文将介绍在 C++ 中声明和使用 PI 常量的不同方法。
使用 GNU C 库中的 M_PI
宏
它使用 C 标准数学库中预定义的宏表达式。该库定义了多个常用的数学常量,如下表所示。M_PI
宏可以赋值给浮点变量,也可以在计算中作为文字值使用。注意,我们使用的是 setprecision
操纵器函数,它可以用来控制输出数的显示精度。
常数 | 定义 |
---|---|
M_E |
自然对数的底数 |
M_LOG2E |
M_E 以 2 为底的对数 |
M_LOG10E |
M_E 以 10 为底的对数 |
M_LN2 |
2 的自然对数 |
M_LN10 |
10 的自然对数 |
M_PI |
圆周率 |
M_PI_2 |
Pi 除以二 |
M_PI_4 |
Pi 除以四 |
M_1_PI |
pi 的倒数(1/pi) |
M_2_PI |
pi 倒数的 2 倍 |
M_2_SQRTPI |
圆周率平方根的倒数的 2 倍 |
M_SQRT2 |
2 的平方根 |
M_SQRT1_2 |
2 的平方根的倒数(也是 1/2 的平方根) |
#include <iostream>
#include <iomanip>
#include <cmath>
using std::cout;
using std::endl;
int main() {
double pi1 = M_PI;
cout << "pi = " << std::setprecision(16)
<< M_PI << endl;
cout << "pi * 2 = " << std::setprecision(16)
<< pi1 * 2 << endl;
cout << "M_PI * 2 = " << std::setprecision(16)
<< M_PI * 2 << endl;
cout << endl;
return EXIT_SUCCESS;
}
输出:
pi = 3.141592653589793
pi * 2 = 6.283185307179586
M_PI * 2 = 6.283185307179586
从 C++20 开始使用 std::numbers::pi
常数
自 C++20 标准以来,该语言支持在 <numbers>
头文件中定义的数学常量。这些常量被认为可以提供更好的跨平台兼容性,但目前仍处于早期阶段,各种编译器可能还不支持它。完整的常量列表可以在这里看到。
#include <iostream>
#include <iomanip>
#include <numbers>
using std::cout;
using std::endl;
int main() {
cout << "pi = " << std::setprecision(16)
<< std::numbers::pi << endl;
cout << "pi * 2 = " << std::setprecision(16)
<< std::numbers::pi * 2 << endl;
cout << endl;
return EXIT_SUCCESS;
}
pi = 3.141592653589793
pi * 2 = 6.283185307179586
声明自己的 PI 常量变量
另外,也可以根据需要用 PI 值或任何其他数学常数声明一个自定义常数变量。可以使用宏表达式或变量的 constexpr
指定符来实现。下面的示例代码演示了这两种方法的使用。
#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
# define MY_PI 3.14159265358979323846
constexpr double my_pi = 3.141592653589793238462643383279502884L;
int main() {
cout << std::setprecision(16) << MY_PI << endl;
cout << std::setprecision(16) << my_pi << endl;
return EXIT_SUCCESS;
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn