圆周率的几种C语言编程代码_第1页
圆周率的几种C语言编程代码_第2页
圆周率的几种C语言编程代码_第3页
圆周率的几种C语言编程代码_第4页
圆周率的几种C语言编程代码_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.wd.wd.wd.计算的方法一、蒙特卡罗法Monte Carlo蒙特卡洛方法是一种以概率统计理论为指导的一类非常重要的数值计算方法。蒙特卡罗是摩纳哥公国的一座城市赌城。Buffon投针就是蒙特卡洛方法的思想,但是Buffon是蒙特卡洛方法的起源。蒙特卡洛方法同样可以通过随机通过产生随机数的方式来解决计算问题。比方估算和计算不规那么图形的面积。图1蒙特卡罗方法模拟这种方法是一种利用计算机随机数的功能基于“随机数的算法,通过计算落在单位圆内的点与落在正方形内的点的比值求PI。 图2蒙特卡罗方法由于图形的对称性,我们靠考虑该图的四分之一局部。假定一点能够均匀地扔到一个正方形中,计算落入其中的点个数

2、。通过计数其中落入内切圆的点的个数;如果一共投入N个点,其中有M个落入圆中,那么只要点均匀,假定圆周的半径为R,那么: 式1该方法得到的要得到的精度与投入点的个数有关,一般个数较大时精度比较高。/Monte Carlo Methoddouble rand_pi(int n) int numInCircle = 0;double x, y;double pi;for (int i = 0; i n; i+)x = rand()*1.0/RAND_MAX;y = rand()*1.0/RAND_MAX;if (x * x + y * y 1)numInCircle+;pi = (4.0 * num

3、InCircle) / n;return pi;图3蒙特卡罗例如代码写出来你的代码实际测试结果10 Marks表1蒙特卡罗方法实际测试结果次数10102103104105106107108109计算值运行时间ms误差二、数学公式级数由数学公式:式2当n取1000时就很接近真实值了n=1000时,pi=3.1406380562059946。/Numerical Series/Sigma(1/n2) = pi/6double math_Pi(int n) int numInCircle = 0;double sum = 0;double pi;for (int i = 1; i = n; i+)s

4、um += 1.0 / (double)i*i);pi = sqrt(sum * 6);return pi;图4级数方法例如代码写出来你的代码实际测试结果10 Marks表2 级数方法实际测试结果次数10102103104105106107108109计算值运行时间ms误差三、划分网格计算图5蒙特卡罗例如代码将图片分为n*n个小方形,统计落在圆内的个数占所有方形的比例。/Grid Countdouble grid_Pi(int n) int i;double sum = 0;for (i = 0; i n; i+)sum += (int)sqrt(n*(double)n - i*(double

5、)i);return (4.0 * sum) / n / n;图6网格划分例如代码写出来你的代码实际测试结果10 Marks表3 网格划分方法实际测试结果次数10102103104105106107108109计算值运行时间ms误差Appendix时间统计方法一:clock统计在待测试程序的开场局部和完毕局局部别参加clock统计,两个之间的差值就是该局部代码运行时间。需要注意的是Windows下和Linux下头文件不一样。clock_tstart;clock_tend;/get current clock countstart = clock();/Insert your code here

6、/get current clock countend = clock();printf(The time duration is %d ms.n, end - start);方法二:系统API准确统计时间Windows 和Linux下均有准确计时方法。在Windows下可以用系统提供的API函数QueryPerformanceFrequency 和QueryPerformanceCounter来进展高精度的计时,现在的机器 基本上都提供这种高精度的计时啦,所以不用担忧。利用该函数可以准确的计时到微妙级别。QueryPerformanceFrequency() 可以得到CPU的时钟频率。Que

7、ryPerformanceCounter() 可以通过两次的差值来得到CPU的时钟周期差值。这样就可以计算出两次差值之间所花费的时间,当然这里计算出来的时间是秒,一般都换算为毫秒或者微秒来表示。Windows#ifdef _WIN32LARGE_INTEGER num;long long start, end, freq, time1, time2;#endif/开场计时#ifdef _WIN32QueryPerformanceFrequency(&num);freq = num.QuadPart;QueryPerformanceCounter(&num);start = num.QuadPa

8、rt;#endif/Insert your code here/插入待测时间代码/ Sleep(1000);/完毕计时时间#ifdef _WIN32QueryPerformanceCounter(&num);end = num.QuadPart;time1 = (end - start) * 1000 / freq;printf(nDuration time=%d msn, (end - start) * 1000 / freq);#endifgettimeofday 准确到微秒级别计时函数 int gettimeofday(structtimeval *tv,struct timezone

9、*tz);说明:gettimeofday将时间保存在构造tv之中,strut timeval gives the number of seconds and microsecondssince the Epoch,(00:00:00 UTC, January 1, 1970), measured inmicroseconds.tz(即timezone,很少用到)一般我们使用null来代替。保存时间的构造体strut timeval long tv_sec;long tv_usec;注:需要头文件#include Linux#ifdef linuxstruct timeval ta, tb;do

10、uble mseca, msecb;#endif/开场计时#ifdef linuxgettimeofday(&ta, NULL);mseca = ta.tv_sec*1000000.0 + ta.tv_usec;#endif/插入运行代码/Insert your code here/ Sleep(1000);/完毕计时#ifdef linuxgettimeofday(&tb, NULL);msecb = tb.tv_sec*1000000.0 + tb.tv_usec;msecb -= mseca;printf(Total time is %.10f us.n, msecb);#endif欢迎您的光临,Word文档下载后可修改编辑.双击可删除页眉页脚.谢谢!希望您提出您珍贵的意见,你的意见是我进步的动力。赠语; 1、如果我们做与不做都会有人笑,如果做不好与做得好还会有人

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论