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