主题:一个很牛的计算pi的c程序
yaozheng
[专家分:28410] 发布于 2003-08-18 22:46:00
#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 楼
hadg83 [专家分:10] 发布于 2005-11-06 18:08:00
好帅啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
92 楼
flysun0311 [专家分:2040] 发布于 2005-11-06 18:20:00
计算圆周率!我感觉大概是这样!
93 楼
true5toss [专家分:60] 发布于 2005-12-09 02:55:00
我很佩服
看来高精度的计算还有让我眼界大开的地方
不只是求pi
94 楼
xaw1031 [专家分:0] 发布于 2005-12-09 08:59:00
世界上强人就是多啊!
我什么时候能成为强人啊?
95 楼
wangbotao [专家分:50] 发布于 2005-12-09 09:15:00
牛X啊
为什么呢?
96 楼
boxertony [专家分:23030] 发布于 2005-12-09 11:43:00
下面的这个地址给了详细的说明:
http://sflab.org/bbs/read.php?fid=11&tid=192&page=lastpost
97 楼
nchang [专家分:0] 发布于 2005-12-09 12:16:00
我觉得看这种风格混乱的程序是一种乐趣,因为它可以告诉你许多没有注意过的语法问题。以下是我对这个程序的一点(仅语法而不是算法)方面的分析[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 楼
白露秋分 [专家分:0] 发布于 2005-12-21 19:18:00
仔细研究了一下
在第二重循环中一轮下来的序列是这样的
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 楼
li129667 [专家分:0] 发布于 2006-01-03 20:11:00
看不懂~~~T_T~~
100 楼
yhwbb [专家分:10] 发布于 2006-02-12 00:37:00
求PI的公式有很多,作者是不是在套用一个公式啊,如果是这样的,只有作者才知道他套的是什么样的公式吧。
我来回复