如何在 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