欢迎来到天天文库
浏览记录
ID:47129879
大小:818.05 KB
页数:9页
时间:2019-08-10
《圆周率地几种C语言编程代码》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实用文档计算π的方法一、蒙特卡罗法(MonteCarlo)蒙特卡洛方法是一种以概率统计理论为指导的一类非常重要的数值计算方法。蒙特卡罗是摩纳哥公国的一座城市(赌城)。Buffon投针就是蒙特卡洛方法的思想,但是Buffon是蒙特卡洛方法的起源。蒙特卡洛方法同样可以通过随机通过产生随机数的方式来解决计算问题。比如估算和计算不规则图形的面积。图1蒙特卡罗方法模拟这种方法是一种利用计算机随机数的功能基于“随机数”的算法,通过计算落在单位圆内的点与落在正方形内的点的比值求PI。文案大全实用文档图2蒙特卡罗方法由于图形的对称性,我们靠考虑该图的四分
2、之一部分。假定一点能够均匀地扔到一个正方形中,计算落入其中的点个数。通过计数其中落入内切圆的点的个数;如果一共投入N个点,其中有M个落入圆中,则只要点均匀,假定圆周的半径为R,则:式(1)该方法得到的要得到π的精度与投入点的个数有关,一般个数较大时精度比较高。//MonteCarloMethoddoublerand_pi(intn){intnumInCircle=0;doublex,y;doublepi;文案大全实用文档for(inti=0;i3、MAX;if(x*x+y*y<1)numInCircle++;}pi=(4.0*numInCircle)/n;returnpi;}图3蒙特卡罗示例代码写出来你的代码实际测试结果(10Marks)表1蒙特卡罗方法实际测试结果次数10102103104105106107108109计算值运行时间(ms)误差二、数学公式(级数)由数学公式: 式(2)当n取1000时就很接近真实值了n=1000时,pi=3.1406380562059946。//NumericalSeries//Sigma(1/n^2)=pi/6doublemath_Pi(int4、n){文案大全实用文档intnumInCircle=0;doublesum=0;doublepi;for(inti=1;i<=n;i++){sum+=1.0/((double)i*i);}pi=sqrt(sum*6);returnpi;}图4级数方法示例代码写出来你的代码实际测试结果(10Marks)表2级数方法实际测试结果次数10102103104105106107108109计算值运行时间(ms)误差三、划分网格计算π文案大全实用文档图5蒙特卡罗示例代码将图片分为n*n个小方形,统计落在圆内的个数占所有方形的比例。//GridCoun5、tdoublegrid_Pi(intn){inti;doublesum=0;for(i=0;i6、分代码运行时间。需要注意的是Windows下和Linux下头文件不一样。clock_tstart;clock_tend;//getcurrentclockcountstart=clock();//Insertyourcodehere//getcurrentclockcountend=clock();printf("Thetimedurationis%dms.",end-start);方法二:系统API精确统计时间Windows和Linux下均有精确计时方法。在Windows下可以用系统提供的API函数 QueryPerformance7、Frequency文案大全实用文档和 QueryPerformanceCounter 来进行高精度的计时,现在的机器基本上都提供这种高精度的计时啦,所以不用担心。利用该函数可以精确的计时到微妙级别。QueryPerformanceFrequency()可以得到CPU的时钟频率。QueryPerformanceCounter()可以通过两次的差值来得到CPU的时钟周期差值。这样就可以计算出两次差值之间所花费的时间,当然这里计算出来的时间是秒,一般都换算为毫秒或者微秒来表示。Windows#ifdef_WIN32LARGE_INTEGERnu8、m;longlongstart,end,freq,time1,time2;#endif//开始计时#ifdef_WIN32QueryPerformanceFrequency(&num);fre
3、MAX;if(x*x+y*y<1)numInCircle++;}pi=(4.0*numInCircle)/n;returnpi;}图3蒙特卡罗示例代码写出来你的代码实际测试结果(10Marks)表1蒙特卡罗方法实际测试结果次数10102103104105106107108109计算值运行时间(ms)误差二、数学公式(级数)由数学公式: 式(2)当n取1000时就很接近真实值了n=1000时,pi=3.1406380562059946。//NumericalSeries//Sigma(1/n^2)=pi/6doublemath_Pi(int
4、n){文案大全实用文档intnumInCircle=0;doublesum=0;doublepi;for(inti=1;i<=n;i++){sum+=1.0/((double)i*i);}pi=sqrt(sum*6);returnpi;}图4级数方法示例代码写出来你的代码实际测试结果(10Marks)表2级数方法实际测试结果次数10102103104105106107108109计算值运行时间(ms)误差三、划分网格计算π文案大全实用文档图5蒙特卡罗示例代码将图片分为n*n个小方形,统计落在圆内的个数占所有方形的比例。//GridCoun
5、tdoublegrid_Pi(intn){inti;doublesum=0;for(i=0;i6、分代码运行时间。需要注意的是Windows下和Linux下头文件不一样。clock_tstart;clock_tend;//getcurrentclockcountstart=clock();//Insertyourcodehere//getcurrentclockcountend=clock();printf("Thetimedurationis%dms.",end-start);方法二:系统API精确统计时间Windows和Linux下均有精确计时方法。在Windows下可以用系统提供的API函数 QueryPerformance7、Frequency文案大全实用文档和 QueryPerformanceCounter 来进行高精度的计时,现在的机器基本上都提供这种高精度的计时啦,所以不用担心。利用该函数可以精确的计时到微妙级别。QueryPerformanceFrequency()可以得到CPU的时钟频率。QueryPerformanceCounter()可以通过两次的差值来得到CPU的时钟周期差值。这样就可以计算出两次差值之间所花费的时间,当然这里计算出来的时间是秒,一般都换算为毫秒或者微秒来表示。Windows#ifdef_WIN32LARGE_INTEGERnu8、m;longlongstart,end,freq,time1,time2;#endif//开始计时#ifdef_WIN32QueryPerformanceFrequency(&num);fre
6、分代码运行时间。需要注意的是Windows下和Linux下头文件不一样。clock_tstart;clock_tend;//getcurrentclockcountstart=clock();//Insertyourcodehere//getcurrentclockcountend=clock();printf("Thetimedurationis%dms.",end-start);方法二:系统API精确统计时间Windows和Linux下均有精确计时方法。在Windows下可以用系统提供的API函数 QueryPerformance
7、Frequency文案大全实用文档和 QueryPerformanceCounter 来进行高精度的计时,现在的机器基本上都提供这种高精度的计时啦,所以不用担心。利用该函数可以精确的计时到微妙级别。QueryPerformanceFrequency()可以得到CPU的时钟频率。QueryPerformanceCounter()可以通过两次的差值来得到CPU的时钟周期差值。这样就可以计算出两次差值之间所花费的时间,当然这里计算出来的时间是秒,一般都换算为毫秒或者微秒来表示。Windows#ifdef_WIN32LARGE_INTEGERnu
8、m;longlongstart,end,freq,time1,time2;#endif//开始计时#ifdef_WIN32QueryPerformanceFrequency(&num);fre
此文档下载收益归作者所有