題目給出的公式:
π = 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;
}
萊布尼茨級數收斂極慢(對數級):
| 項數 | 近似值 | 有效數字 |
|---|---|---|
| 10 | 3.0418 | 0 |
| 100 | 3.1316 | 1 |
| 1,000 | 3.1406 | 2 |
| 10,000 | 3.1415 | 3 |
| 1,000,000 | 3.141592 | 5 |