计算公式
取近似值
该公式可以方便地用迭代法实现,代码如下
#include <stdio.h>
int main()
{
int i;
double sum = 1.0;
for (i = 100; i >= 1; i--)
{
sum /= i;
sum += 1.0;
}
printf("%1.15lf\n", sum);
return 0;
}
程序运行结果为
gcc -o pi pi.c
./pi
2.718281828459045
高精度实现
高精度实现的代码如下
#include <stdio.h>
#define ARRAY_SIZE 2502
#define ITERATIONS 5000
int e[ARRAY_SIZE+1];
int main()
{
int i, j;
// e = 1.0;
e[0] = 1000;
for(i = ITERATIONS; i > 0 ; i--)
{
// e /= i;
for(j = 0; j < ARRAY_SIZE; j++)
{
e[j + 1] += e[j] % i * 10000;
e[j] /= i;
}
// e += 1.0;
e[0] += 1000;
}
for(i = 0; i < 2500; i++)
{
printf("%04d", e[i]);
}
return 0;
}
误差分析
截断误差
截断误差
舍入误差
设数组e的大小为k+1,则每次运算的舍入误差不超过$\frac{1}{10^{4k}}$,则多次运算积累的舍入误差
参数选取
若要计算$\pi$的前N位有效数字,须满足
又
故取n和k满足下式即可
不妨取
取