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