回 帖 发 新 帖 刷新版面

主题:一个很牛的计算pi的c程序

#include <stdlib.h>  
#include <stdio.h>  

long a=10000,b,c=2800,d,e,f[2801],g;  

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);  
}  

计算结果:  
31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185  

回复列表 (共115个回复)

91 楼

好帅啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

92 楼

计算圆周率!我感觉大概是这样!

93 楼

我很佩服
看来高精度的计算还有让我眼界大开的地方
不只是求pi

94 楼

世界上强人就是多啊!
我什么时候能成为强人啊?

95 楼

牛X啊
为什么呢?

96 楼

下面的这个地址给了详细的说明:
http://sflab.org/bbs/read.php?fid=11&tid=192&page=lastpost

97 楼

我觉得看这种风格混乱的程序是一种乐趣,因为它可以告诉你许多没有注意过的语法问题。以下是我对这个程序的一点(仅语法而不是算法)方面的分析[em8]
long a=10000,b,c=2800,d,e,f[2801],g;
/*初始化的问题:在C/C++中对于全局变量是存储于数据段的,所以在编译连接时就要给定初值,没有初始化则程序默认为0*/
main()  
{  
for(;b-c;)  //这个循环则是当b==c时就结束了
f[b++]=a/5;  //f初始化所有元素为2000
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);
/*这两句很有意思,因为它考察了对运算符逗号和运算符--结合性的理解,如果理解了这两个,程序要执行什么我们就会很清楚了*/
/*对于逗号,不只是在定义多个变量时用力分隔变量,而在做运算符时只产生最后一个表达式的值,其余表达式的计算只完成它们的副作用。例如for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)中d=0,g=c*2程序完成给d,g复值,而只判断g是否为0,为0则结束循环*/
/*对于for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); 中的f[b]=d%--g,d/=g--就是f[b]=d%(--g),d=d/(g--)*/


}

98 楼

仔细研究了一下
在第二重循环中一轮下来的序列是这样的
f[c]*a*(c-1)*(c-2)*...*2/( (2c-1)*(2c-3)*...*3) +
f[c-1]*a*(c-3)*(c-5)*...*2/( (2c-3)*(2c-5)*...*3) +
.
.
.
可以肯定是采用了pi/2 = 1 + (1/3)*(2/3)+(1/3)*(2/3)*(3/5)...
= 1+(1*2*3*...)/( (2*2-1)*(2*3-1)*(2*4-1)* )...

99 楼

看不懂~~~T_T~~

100 楼

求PI的公式有很多,作者是不是在套用一个公式啊,如果是这样的,只有作者才知道他套的是什么样的公式吧。

我来回复

您尚未登录,请登录后再回复。点此登录或注册