如何在 C++ 中使用 PI 常数

Jinku Hu 2023年10月12日
  1. 使用 GNU C 库中的 M_PI
  2. 从 C++20 开始使用 std::numbers::pi 常数
  3. 声明自己的 PI 常量变量
如何在 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 <cmath>
#include <iomanip>
#include <iostream>

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 <iomanip>
#include <iostream>
#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 <iomanip>
#include <iostream>

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;
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ Math