首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言計算圓周率:萊布尼茨級數實現與精度分析

     編輯:關於C語言

萊布尼茨級數求 π 原理

題目給出的公式:

π = 4 × (1 - 1/3 + 1/5 - 1/7 + ... + 1/(4n-3) - 1/(4n-1))

這是著名的 萊布尼茨級數(Leibniz formula for π),屬於格雷戈里級數的特例:

arctan(x) = x - x³/3 + x⁵/5 - x⁷/7 + ...

令 x = 1,得 arctan(1) = π/4,即上述級數。

代碼實現與改進

原始代碼分析

#include <stdio.h>
#include <math.h>

int main(void) {
    double a = 0, b = 1;
    int i;
    for (i = 1; i < 100000; i++) {
        b = pow(-1, i + 1) / (2 * i - 1);
        a += b;
    }
    printf("%lf\n", 4 * a);
    return 0;
}

存在的問題

  • pow(-1, i+1) 極其低效:浮點冪運算開銷大,且引入浮點誤差
  • 符號翻轉可用整數邏輯 sign = -sign 實現
  • 分母 2*i-1 可遞推計算,避免乘法
  • 未檢查收斂精度,固定迭代次數

優化版實現

#include <stdio.h>
#include <math.h>

int main(void) {
    double pi = 0.0;
    double denominator = 1.0;
    int sign = 1;
    const double EPS = 1e-15;  // 雙精度極限約 1e-15

    for (int i = 0; ; ++i) {
        double term = sign / denominator;
        pi += term;
        
        if (fabs(term) < EPS) break;  // 項值小於精度閾值停止
        
        denominator += 2.0;
        sign = -sign;
    }

    printf("π ≈ %.15f\n", 4 * pi);
    printf("M_PI = %.15f\n", M_PI);  // math.h 中定義的常量
    printf("誤差 = %.2e\n", fabs(4 * pi - M_PI));
    
    return 0;
}

收斂速度分析

萊布尼茨級數收斂極慢(對數級):

獲得雙精度(~15 位)需約 1015 項,完全不可行。

更優算法推薦

  • 馬欽公式:π/4 = 4·arctan(1/5) - arctan(1/239),收斂快得多
  • 查德諾夫斯基算法:現代計算 π 記錄保持者,每項增加 ~14 位精度
  • AGM(算術-幾何平均):二次收斂,Gauss-Legendre 算法
  • 蒙特卡洛法:概率估算,教學演示用

馬欽公式 C 實現片段

double arctan_series(double x, double eps) {
    double term = x, sum = x;
    double x2 = x * x;
    int n = 1;
    while (fabs(term) > eps) {
        term *= -x2 * (2*n-1) / (2*n+1);
        sum += term;
        n++;
    }
    return sum;
}

// π = 16*arctan(1/5) - 4*arctan(1/239)
double pi = 16 * arctan_series(1.0/5, 1e-15) - 4 * arctan_series(1.0/239, 1e-15);

理解級數收斂特性,選擇適合精度需求的算法,是數值計算的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
項數近似值有效數字
103.04180
1003.13161
1,0003.14062
10,0003.14153
1,000,0003.1415925