1. 前言
C語言在需要高效率與低階控制的系統開發及嵌入式系統中,至今依然被廣泛使用。特別是在數學運算中,圓周率(π)是不可或缺的重要常數之一。C語言中,有多種方法可以正確處理這個圓周率。
本文章將全面介紹如何在C語言中使用圓周率,從基礎方法到實際程式範例。重點說明標準函式庫 math.h
內 M_PI
的使用方法、自行定義π的方式,甚至還會介紹利用萊布尼茲公式自行計算圓周率。藉此讓C語言開發者能更有效率地運用圓周率於各種專案中。
2. 在C語言中使用π的基本知識
圓周率(π)簡介
圓周率是將圓的周長除以直徑時得到的數學常數。其值約為3.14159…,是一個無限不循環小數,在幾何計算和物理模擬等場景都扮演著重要角色。在C語言中,可以透過 math.h
標準函式庫方便地取得圓周率。
C語言應用圓周率的情境
常見需要用到圓周率的C語言應用情境如下:
- 幾何運算:例如計算圓或球的面積、體積等,圓周率都是必須的。
- 物理模擬:像是鐘擺運動、圓周運動等,進行物理計算時也需要用到π。
- 圖形處理:在3D圖形、遊戲開發等情境下,繪製圓或曲線時也常用到圓周率。
因為這些場合對計算精度要求高,所以正確理解與處理圓周率的方法在C語言開發中非常重要。
3. M_PI 的用法
math.h
內定義的 M_PI
C語言標準函式庫 math.h
提供了多種數學常數與函式。其中 M_PI
常用來表示圓周率。以下是使用 M_PI
計算圓面積的簡單範例:
#include <stdio.h>
#include <math.h> // 引入 math.h
int main() {
double radius = 5.0; // 半徑為5的圓
double area = M_PI * radius * radius; // 計算面積
// 輸出計算結果
printf("半徑 %.2f 的圓面積: %.5f\n", radius, area);
return 0;
}
上述程式使用 M_PI
計算半徑為5的圓面積,輸出結果如下:
半徑 5.00 的圓面積: 78.53982
M_PI
無法使用時的對策
有些開發環境(如 Visual Studio)預設 math.h
並未定義 M_PI
。遇到這種情況,可以在程式前加上如下預處理指令:
#define _USE_MATH_DEFINES
#include <math.h>
int main() {
printf("圓周率: %f\n", M_PI); // 輸出圓周率
return 0;
}
4. M_PI 無法使用時的解決方式
自行定義圓周率
如果開發環境不支援 M_PI
,可以自行用 #define
定義圓周率。範例如下:
#include <stdio.h>
// 自訂圓周率常數
#define MY_PI 3.14159265358979323846
int main() {
double radius = 5.0;
double area = MY_PI * radius * radius; // 使用自訂π計算面積
printf("自訂π計算的圓面積: %.5f\n", area);
return 0;
}
這種方式可保證在任何開發環境下都能正確處理圓周率,提高程式的可攜性。

5. 用萊布尼茲公式計算π
什麼是萊布尼茲公式?
萊布尼茲公式是一種數學上計算π的方法,公式如下:
π / 4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - ...
利用這個公式,可以用C語言寫出自動計算π的程式。
#include <stdio.h>
void 計算圓周率(unsigned long 次數) {
double pi = 0.0;
int sign = 1;
for (unsigned long i = 0; i < 次數; i++) {
pi += (double)sign / (2 * i + 1); // 依公式計算
sign *= -1; // 正負號交替
}
printf("計算得到的圓周率: %.15f\n", pi * 4);
}
int main() {
計算圓周率(1000000); // 反覆100萬次計算π
return 0;
}
這段程式會根據設定的次數,利用萊布尼茲公式計算圓周率。次數越多,π的計算值越精確。例如100萬次迴圈下,結果如下:
計算得到的圓周率: 3.141592653590
6. 浮點數與π的精度問題
浮點數精度說明
在電腦處理π時,必須注意浮點數的精度。C語言中有 float
、double
、long double
三種浮點數型態,各自的精度不同,數值越大時誤差可能越明顯。
float
型:32位元,約7位十進位精度。double
型:64位元,約15位十進位精度。long double
型:一般為80位元以上,可達19位以上十進位精度。
以下範例說明不同型態下使用π的差異:
#include <stdio.h>
#define M_PI 3.14159265358979323846
int main() {
float f_pi = (float)M_PI; // float 型
double d_pi = M_PI; // double 型
long double ld_pi = (long double)M_PI; // long double 型
// 輸出不同精度下π的值
printf("float 型的π: %.7f\n", f_pi);
printf("double 型的π: %.15f\n", d_pi);
printf("long double 型的π: %.19Lf\n", ld_pi);
return 0;
}
累積誤差問題
反覆運算時,浮點數精度的影響會造成誤差累積。這在大型物理模擬或金融計算等需要多次計算的場合特別明顯。如下例將0.1累加100萬次,會出現誤差:
#include <stdio.h>
int main() {
double sum = 0.0;
for (int i = 0; i < 1000000; i++) {
sum += 0.1; // 重複加總
}
printf("理論結果: 100000.0\n");
printf("實際結果: %.15f\n", sum);
return 0;
}
預期值是100000.0,但因浮點數誤差,實際結果會有細微差異。這就是累積誤差的影響。
7. 實際程式範例
使用 M_PI
的圓周率程式
以下示範如何以 M_PI
計算圓面積:
#include <stdio.h>
#include <math.h>
int main() {
double radius = 10.0; // 半徑
double area = M_PI * radius * radius; // 計算圓面積
// 輸出結果
printf("半徑 %.2f 的圓面積為 %.5f。\n", radius, area);
return 0;
}
這個程式會輸出半徑10的圓面積。M_PI
讓你可以輕鬆取得π的值。
用萊布尼茲公式計算π的程式
再舉一個利用萊布尼茲公式計算π的C語言範例:
#include <stdio.h>
void calc_pi(unsigned long iterations) {
double pi = 0.0;
int sign = 1;
for (unsigned long i = 0; i < iterations; i++) {
pi += sign / (2.0 * i + 1); // 按公式計算
sign *= -1;
}
printf("重複 %lu 次計算得到的圓周率: %.15f\n", iterations, pi * 4);
}
int main() {
calc_pi(1000000); // 100萬次反覆計算π
return 0;
}
此程式會根據指定次數重複計算,最後輸出高精度的π值。
8. 總結
本篇文章介紹了在C語言中各種處理圓周率(π)的方法,包括使用 math.h
提供的 M_PI
、自行定義常數、以及利用萊布尼茲公式計算π。此外,也說明了浮點數精度和累積誤差問題,並以程式範例輔助說明。
相信讀者已能理解如何在C語言數值計算中實現高精度運算。建議進一步學習更多數學常數與數學函式的應用,強化你的程式設計實力。