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

Jinku Hu 2023年1月30日 2020年10月15日
  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 <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;
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

相关文章 - C++ Math