c语言天书__圆周率的计算及分析.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c语言天书__圆周率的计算及分析,c语言计算圆周率,c语言圆周率,c语言求圆周率,c语言求圆周率近似值,c语言圆周率100位,c语言中圆周率,全国计算机二级c语言,c语言计算器,用c语言编写计算器

求圆周率π的C程序分析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); scanf(%s);} 简短的4行代码,就可以精确计算机出800位的PI(圆周率)值。 实在太震撼人心了。这样的程序也能运行,竟然还能能完成这样让人难以置信的任务,真是太神了。 一、源程序 本文分析下面这个很流行的计算PI的小程序。下面这个程序初看起来似乎摸不到头脑,不过不用担心,当你读完本文的时候就能够基本读懂它了。程序一:很牛的计算Pi的程序 #include stdio.h int 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); } 二、数学公式 数学家们研究了数不清的方法来计算PI,这个程序所用的公式如下: pi = 2 +?1/3 * (2 +?2/5 * (2 +?3/7 * (2 + ...? (2 +?k/2k+1 * (2 + ... ))...))) 至于这个公式为什么能够计算出PI,已经超出了本文的能力范围。 下面要做的事情就是要分析清楚程序是如何实现这个公式的。 我们先来验证一下这个公式: 程序二:Pi公式验证程序 #include stdio.h void main() { ?? float pi=2; ?? int? i; ?? for(i=100;i=1;i--) ????? pi=pi*(float)i/(2*i+1)+2; ?? printf(%f\n,pi); ?? getchar(); } 上面这个程序的结果是3.141593。 三、程序展开 在正式分析程序之前,我们需要对程序一进行一下展开。我们可以看出程序一都是使用for循环来完成计算的,这样做虽然可以使得程序短小,但是却很难读懂。根据for循环的运行顺序,我们可以把它展开为如下while循环的程序: 程序三:for转换为while之后的程序 #include stdio.h int a=10000,b,c=2800,d,e,f[2801],g; main() { int i; for(i=0;ic;i++) ???? f[i]=a/5; while(c!=0) ???? { ???????? d=0; ???????? g=c*2; ???????? b=c; ???????? while(1) ??????????? { ??????????????? d=d+f[b]*a; ??????????????? g--; ??????????????? f[b]=d%g; ??????????????? d=d/g; ??????????????? g--; ??????????????? b--; ??????????????? if(b==0) break; ??????????????? d=d*b; ??????????? } ???????? c=c-14; ???????? printf(%.4d,e+d/a); ???????? e=d%a; ??? } } 注: for([1];[2];[3]) {[4];}的运行顺序是[1],[2],[4],[3]。如果有逗号操作符,例如:d=0,g=c*2,则先运行d=0,然后运行g=c*2,并且最终的结果是最后一个表达式的值,也就是这里的c*2。 下面我们就针对展开后的程序来分析。 四、程序分析 要想计算出无限精度的PI,我们需要上述的迭代公式运行无数次,并且其中每个分数也是完全精确的,这在计算机中自然是无法实现的。那么基本实现思想就是迭代足够多次,并且每个分数也足够精确,这样就能够计算出PI的前n位来。上面这个程序计算800位,迭代公式一共迭代2800次。 int a=10000,b,c=2800,d,e,f[2801],g; 这句话中的2800就是迭代次数。 由于float或者double的精度远远不够,因此程序中使用整数类型(实际是长整型),分段运算(每次计算4位)。我们可以看到输出语句printf(%.4d,e+d/a); 其中%.4就是把计算出来的4位输出,我们看到c每次减少14( c=c-14;),

文档评论(0)

docindpp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档