一个求π的经典算法,求解析

pp25210 2011-04-21 08:50:41

#include<stdio.h>
long a=10000,b,c=2800,d,e,f[2801],g;
void main()
{
for(; b-c ;)
f[b++]=a/5;
for(; d=0,g=c*2; c-=14,printf( "%.4d ",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b)
;
printf("\n");
}

...全文
1781 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
_menglan_Zi 2011-07-30
  • 打赏
  • 举报
回复
又是泰勒公式
应该不难的
staticabc 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mlee79 的回复:]
4arctan(1) 是不能用来作高精度运算地, 收敛速度太慢了。。。

这个是这个公式:
PI = 2 + ( 1/(2*1+1) * (2+2/(2*2+1) * (2+3/(2*3+1) * (2+ ... * (2+k/(2*k+1) ... )))))
这个得等数学的高人来解释。。。

一般精度的 PI 运算用 PI/4 = 4 * arctan(1/5) - arcta……
[/Quote]
7楼给出的公式只是第一遍做第二个for时的d的值,不是π的值,找了一晚还是没找到楼主用的计算π的表达式,有谁知道啊,肯定不是泰勒级数,╮(╯▽╰)╭
mLee79 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 staticabc 的回复:]

引用 7 楼 mlee79 的回复:
4arctan(1) 是不能用来作高精度运算地, 收敛速度太慢了。。。

这个是这个公式:
PI = 2 + ( 1/(2*1+1) * (2+2/(2*2+1) * (2+3/(2*3+1) * (2+ ... * (2+k/(2*k+1) ... )))))
这个得等数学的高人来解释。。。

一般精度的 PI 运算用 PI/4 = 4 * ……
[/Quote]
很显然, 你没看明白...
拿着这代码, 随便google下就知道...
staticabc 2011-04-23
  • 打赏
  • 举报
回复
又找到一个,更详细的:
http://wangcong.org/articles/puzzle.html
staticabc 2011-04-23
  • 打赏
  • 举报
回复
http://202.113.13.175/zx/resource/20060902173044%E8%83%BD%E7%AE%97%E5%9C%86%E5%91%A8%E7%8E%87pi%E5%88%B0800%E4%BD%8D.txt
按楼上的建议,我google了一下,这个文档说得很清楚,虽然没有给出公式的推导过程,也还够详细的了,楼主可以看看。
guyu2011 2011-04-22
  • 打赏
  • 举报
回复
e,this is problem~~~
mLee79 2011-04-22
  • 打赏
  • 举报
回复
4arctan(1) 是不能用来作高精度运算地, 收敛速度太慢了。。。

这个是这个公式:
PI = 2 + ( 1/(2*1+1) * (2+2/(2*2+1) * (2+3/(2*3+1) * (2+ ... * (2+k/(2*k+1) ... )))))

这个得等数学的高人来解释。。。

一般精度的 PI 运算用 PI/4 = 4 * arctan(1/5) - arctan(239)
速度要快点用 SuperPI 用的倍增公式。。。
现在最快的应该是 PiFast 用的 拉马努金改进公式 。。。
staticabc 2011-04-22
  • 打赏
  • 举报
回复
我把那段代码用规范的形式写了一下,你先看一下,算法,我再看看,研究研究。
#include<stdio.h>
long a=10000,b=0,c=2800,d=0,e=0,f[2801],g=0;
void main()
{
while(b-c)
{
f[b]=a/5;
b++;
}
for(; g=c*2; e=d%a)
{
d=0;
for(b=c;--b;d*=b)
{
d+=f[b]*a;
f[b]=d%--g;
d/=g--;
}
d+=f[b]*a;
f[b]=d%--g;
d/=g--;
c-=14;
printf( "%.4d ",e+d/a);
}
printf("\n");
}
pp25210 2011-04-21
  • 打赏
  • 举报
回复

#include<stdio.h>
#include "math.h "
int main()
{
int s;
float n,t,pi;
t=1;pi=0;n=1;s=1;
while((fabs(t)>=1e-6))
{
pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
printf( "pi=%10.6f\n ",pi);

return 0;
}

这是利用泰勒级数方法求解PI的,上面那个不是,是另外一种算法,比泰勒级数方法求解效率更高更精确
「已注销」 2011-04-21
  • 打赏
  • 举报
回复
这应该是利用泰勒级数方法求解PI

首先,方法本身是将arctan(x)在x=1点出展开,得到
PI / 4 = 1 - 1/3 + 1/5 -1/7 + 1/9 .... ((-1)^n-1)/(2n-1)
根据上式可以以逼近的方计算出PI

LZ给的程序,应该就是泰勒级数法,但是实现的比较有技巧:
根据上式,计算上有两个问题:
1)用浮点数,计算精度有限;
2)比方说,我要精确到小数点后200位,那么我要把n算到多少,才能达到要求精度。

LZ的程序的实现方法,解决了以上两个问题。
1)长整形实现,将一次迭代的余数放到到下一次中参与计算,可以达到无限精度;
2)控制迭代次数,也就控制了精确位数。

因为我没写过这个算法,所以对实现中数值的设定不是很明白,下面只能做个简单的解析:
a:控制一次迭代计算位数,可以理解为一个基数,如10000是4位,1000是3位, 100000就是5位
这一点是从迭代中e+d/a,e=d%a推导出来的。
c:控制计算精度,2800就是2800 / 14 * 4 = 800位
g:比较明显,这个是公式的分母
另外,理解C++逗号运算符的话,对代码结构的解读应该没问题。
pathuang68 2011-04-21
  • 打赏
  • 举报
回复
在《古今数学思想》那套书中,求π的算法应该有很多种,其中最古怪的算法是一个印度数学家(全部考自学的)给出的一个很奇怪的公式,无法证明,但计算结果却是正确的。

最经典的求π的算法,还是用级数来做的:
π = 4 * (1 - 1/3 + 1/5 - 1/7 + ... )
这个都是可以证明出来的:
1-x^2+x^4-x^6+x^8……=1/(1+x^2)。
对两边就积分得出
x-x^3/3+x^5/5-x^7/7+x^9/9…… = tan-1(x) + C,c 为一个常数。
令x为0,可知c等于0
令x=1
得到1-1/3+1/5-1/7+1/9 ……= pi/4

还有一种实验上的做法,画一个正方形,在正方形的内部内切一个圆形,随机地往这个区域扔东西(比如小沙子),最后用:
圆的面积/正方形的面积 = 圆里面的沙粒数量/正方形里的沙粒数量(当然包括圆里面的)
这种方式也可以求得π的比较精确的结果。
...

还有很多招...不记得了
MSOKD 2011-04-21
  • 打赏
  • 举报
回复
算法的东西不懂拿来用就行了,

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧