- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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.hint 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.hvoid 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.hint 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;),
您可能关注的文档
最近下载
- 600MW机组电气系统进DCS逻辑介绍.doc VIP
- 课题申报参考:知识图谱视域下大中小学思政课一体化教学资源库建设与运用研究.docx VIP
- 2025年上海市高考语文 古诗词赏析(考情分析+知识梳理+练习)学生版+解析版 .docx
- 《医院感染风险评估表》.doc VIP
- 谭浩强(第四版)C++程序设计课件.ppt
- 初创公司商业计划书(通用8).docx
- 压力容器的分类90课件.ppt VIP
- 设备供货运输方式及运输方案.docx VIP
- 2023年12月17日广西区税务系统内部遴选笔试真题及答案解析(业务类).doc VIP
- 高中语文部编版必修上册文言文配套练习(附参考答案).doc VIP
文档评论(0)