程序阅读

来源:百度知道 编辑:UC知道 时间:2024/06/16 15:03:55
下列函数的功能是返回圆周率(精度为eps),试写出求圆周率的近似公式。
double pi(double eps)
{ double s=0.0,t=1.0;int n;
for (n=1;t>eps;n++) {s+=t;t=t*n/(2*n+1);}
return(2.0*s);
}

不知道这个是不是你想要的:

S0 = 0;T0 = 1;

Sn = Sn-1 + Tn-1 (1)这里的n和n-1等都是标号
Tn = Tn-1 * n / (2 * n + 1) (2)

根据(1)式,把Sn-1变为Sn-2 + Tn-2,可得
Sn = Sn-2 + Tn-2 + Tn-1
在将Sn-2变为Sn-3 + Tn-3,依此类推,可得
Sn = S0 + T0 + T1 + T2 + ... + Tn-1 (n>=1)
将(2)式代入可得
Sn = 0 + 1 + 1/3 + (1/3)*(2/5) + (1/3)*(2/5)*(3/7) + ... + (n/(2*n+1))*((n-1)/(2*n-1))*((n-2)/(2*n-3))*...*(1/3)
所以,圆周率的近似公式为
p = 2 * [ 1 + 1/3 + (1/3)*(2/5) + (1/3)*(2/5)*(3/7) + ... + (n/(2*n+1))*((n-1)/(2*n-1))*((n-2)/(2*n-3))*...*(1/3)]

用个数验证一下,假如n=4,则有:
p = 2 * [ 1+ 1/3 + (1/3)*(2/5) + (1/3)*(2/5)*(3/7) + (1/3)*(2/5)*(3/7)*(4/9)] = 2 * [ 1 + 0.3333 + 0.1333 + 0.0571 + 0.0254] = 3.0982

n的数值越大离真实值越接近。n和eps的关系式为:
(1/3)*(2/5)*...*(n/(2*n+1))>eps 且
(1/3)*(2/5)*...*((n+1)/(2*(n+1)+1))<=eps

你有什么问题?