多種解法計算圓周率π_第1頁
多種解法計算圓周率π_第2頁
多種解法計算圓周率π_第3頁
多種解法計算圓周率π_第4頁
多種解法計算圓周率π_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、課程設計報告學院、系:吉林大學珠海學院計算機科學與技術系專業(yè)名稱:軟件工程課程設計科目C語言程序課程設計所在班級:學生學號:學生姓名:指導教師:曾志平完成時間:2012年3月-5月題目:多種解法計算圓周率n一、設計任務與目標此問題求圓周率在之前所學的c語言中已經(jīng)接觸過,但是算法單一,采用級數(shù), 而且收斂較慢,故運行時間較長,此程序設計要解決的問題是如何實現(xiàn)高精度的 運算,如何對結果進行輸出,并且嘗試采用不同的方法進行求解圓周率。本次上機實踐所使用的平臺和相關軟件。平臺:windows 7相關軟件:VC+6.0二、方案設計與論證隨機數(shù)法求圓周率可以利用計算機中隨機數(shù)函數(shù)模擬出兩個01之間的浮點型

2、 點(x,y),建立直角坐標系思想,利用邊長為1的正方形內(nèi)切半徑為0.5圓的方 程(x-0.5)*(x-0.5) + (y-0.5)*(y-0.5)=0.25判斷點是否在圓內(nèi),用計數(shù)器b保 存在的點,如此模擬5000次。用落入圓內(nèi)的點數(shù)b的4倍除以總的扔的點數(shù)N 用,可大概求出圓周率的值。一般來說,根據(jù)概率思想,N值越大,模擬次數(shù)越 多,其求出來圓周率的值越接近真實的圓周率。祖沖之迭代法因為圓內(nèi)接正六邊形邊長等于半徑的思想,故可以從正六邊形出 發(fā),不斷迭代,當正多邊形邊數(shù)增加時,其周長也逐漸逼近圓的周長,反過來即 可求的一定精度的圓周率,設圓內(nèi)接正六邊形的邊長為b,邊數(shù)為i,利用公式 七=(也

3、20” )/2進行迭代運算,為了提高精度,算法中對公式進行分開運 算,求得邊數(shù)為2i的圓內(nèi)接正多邊形后得出其周長,運用迭代后的正多邊形周 長減去迭代前的正多邊形周長,獲取其精度程度。如果最終求出的圓內(nèi)接正多邊 形的周長,即接近圓的周長,最后利用數(shù)學公式即可以求出圓周率。輸出其最后 迭代后得圓內(nèi)接正多邊形的邊數(shù)和圓周率即可。用級數(shù)法求圓周率,定義一個a400的數(shù)組用于存儲計算結果,從結果出發(fā), 因為其要輸出一定精度的圓周率,若n值太大會造成計算冗余,利用數(shù)學中不等 式確定其n項,用一個循環(huán)從n1計算每一項的值并存儲,1+n/(2n+1)用數(shù)組模 擬手工乘除加法,除法1/(2n+1),相除后商為a

4、0,然后將余數(shù)乘以10,作 為被除數(shù)再除以除數(shù)取商為十分位,存于a1,如此類推;乘法則每個數(shù)組乘以 n,如果滿十則向前面數(shù)組進一,再取其個位存儲;加法因為加1,則直接可以 加到a0上。然后保存計算結果后用該值計算n-1項,如此重復一直到第1項 后按照格式輸出每個數(shù)組元素即可。附加題圓外切正多邊形與圓內(nèi)接正多邊形算法相似,但是圓半徑的長度為1時, 其外切正六邊形的邊長為2*sqrt(3)/3,并且其迭代公式也相應的進行了改變, b=2*(sqrt(b*b+4)-2)/b;由于圓外切正多邊形迭代后的周長小于迭代前的周長, 故控制精度時用迭代前的正多邊形周長減去迭代后的正多邊形邊長。三、程序框圖或流

5、程圖,程序清單與調(diào)用關系nextl1由主函數(shù)分別調(diào)用void suiji()(即課程第一小問,隨機數(shù)函數(shù)),void neijie() (第二小問,內(nèi)接正多邊形法),void jishu()(第三小問,級數(shù)法),void waiqie()(外切正多邊形法).由于jishu函數(shù)的流程圖過長,造成排版不便,故進行了分段和省略控制輸出等 部分流程圖。四、全部源程序清單#include #include #include #include#define N 5000 void main() void jishu();void neijie();void suiji();void waiqie();su

6、iji(); TOC o 1-5 h z printf(n);neijie();printf(n);jishu();printf(n);waiqie();printf(n);void suiji()double x,y;int a=0,b=0;srand(time(0);while(a+=N)/投 5000 次點x=(double)rand()/RAND_MAX;/產(chǎn)生 01 之間的浮點數(shù)y=(double)rand()/RAND_MAX;/產(chǎn)生 01 之間的浮點數(shù)if(x-0.5)*(x-0.5) + (y-0.5)*(y-0.5)=0.25)/判 斷所產(chǎn)生的點是否在圓內(nèi) b+;/匯總落在圓

7、內(nèi)的點數(shù)printf(用隨機數(shù)法求得丸=%lfn”,4.0*b/N);void neijie()double e,b=1,d; /b:為正多邊形邊長long int i; /i:正多邊形邊數(shù)for(i=6;i*=2) /正多邊形邊數(shù)加倍d=1.0-sqrt(1.0-b*b/4); /計算圓內(nèi)接正多邊形的邊長b=sqrt(b*b/4+d*d);if(2*i*b-i*e 1e-15) /2*i*b迭代后的周長,i*e原來的周長break; /精度達1e-15則停止計算e=b; 保存本次正多邊形的邊長作為下一次精度控制的依據(jù)printf(用圓內(nèi)接正多邊形計算n =%.15lfn 迭代后得正多邊形的邊

8、數(shù) 為:dn”,i*b,i);void waiqie()double e,b=2*sqrt(3)/3,d; /b:為正多邊形邊長long int i; /i:正多邊形邊數(shù)for(i=6;i*=2) /正多邊形邊數(shù)加倍e=b; /e:暫存邊數(shù)為加倍前的邊長d=sqrt(1.0+b*b/4)-1; /計算圓外切正多邊形的邊長b=2*(b*b/4-d*d)/b;if(i*e-2*i*b 1e-15)break; /精度達1e-15則停止計算e=b; 保存本次正多邊形的邊長作為下一次精度控制的依據(jù)printf(附加題:外切正多邊形計算n=%.15lfn迭代后得正多邊形的邊數(shù) 為:dn”,i*b,i);

9、void jishu()float s;int x,b,c,i,j,n,e,a400;for(s=0,n=1;n100) break;for(i=0;i=1;b-)c=2*b+1;/首先用除法計算1/2n+1的高精度商for(i=0;i=0;i-)/計算 n/(2n+1)的高精度值ai=ai*b+j;/數(shù)組模擬手工乘法,每個數(shù)組乘以nj=ai/10;/如果滴十則對前面數(shù)組進1ai=ai%10;/而該數(shù)組取個位a0=a0+1;/計算 1+n/(2n+1)的高精度值x=a0;for(j=0,i=101;i=0;i-)ai=ai*2+j;j=ai/10;ai=ai%10;/因為公式左邊還有個 1/2

10、,對結果整 體乘以二,模擬手工乘法printf (-用級數(shù)方法求得n=%d.,a0);/控制格式并輸出結果 for(e=0,i=1;i=100;i+)printf(%d,ai);e+;if(e%30=0)printf(n);printf(n);五、程序運行結果測試與分析由輸出結果可以看出,隨機數(shù)法求得圓周率浮動較大,也許赴值設為5000還過于小造成 結果誤差大,然后把N值設為50000后繼續(xù)測試如下I 1 C:Wi nd o wsE;yEtem3 2D buge.exe用隧和券法而亍了1函函用值|接正多認萬計算蕓一“姑甲耶9器司 遙代后得正予山犯區(qū)辿哉力1066296用瑟我方性 *得,1.,的

11、的心抑 WA麗冊4偵/1皿河料1嶼g 心 4咬卜切正形計算 7T =3.11592653589796 打薦正矛穌;曲曲藪為:1B0663296Press anu to continue.當N值為50000時,測試結果較為接近圓周率且比較數(shù)值浮動較小,其余小問測試結果基 本接近真實圓周率的值,基本完成程序設計目標。六、結論與心得設計中遇到的問題及解決過程在設計過程中遇到第三小問需要保存100位圓周率的時候,和同學討論后才明白 結果可以用數(shù)組保存并輸出,附加小問時圓外切正多邊形時剛來采用的是d=sqrt(1.0+b*b/4)-1 ; b=2*(sqrt(b*b+4)-2)/b,后來發(fā)現(xiàn)誤差很大,改

12、用公式 b=2*(b*b/4-d*d)/b 才 能夠接近,思考后發(fā)現(xiàn)b=2*(b*b/4-d*d)/b (誤差較小)將d代入,得 b=2*(b*b/4-(sqrt(b*b/4+1)-1)*(sqrt(b*b/4+1)-1)/b;(就這樣寫誤差還是比 較小的,幾乎跟內(nèi)切法的精度一樣),再化簡得 b=2*(b*b/4-(b*b/4+1)-1+2*sqrt(b*b/4+1)/b;(這個時候誤差就大了,i 只有 49152),再化簡 b=2*(2*sqrt(b*b/4+1)-2)/b 即 b=2*(sqrt(b*b+4)-2)/b(誤差 依然比較大),所以斷定d*d為誤差所在。我的理解:無論如何,b,

13、d等這些值是 一定有偏差的,b=2*(b*b/4-d*d)/b=2*(b/2+d)*(b/2-d)/b,由于 d 進行了開根處 理,誤差微乎其微,幾乎可以忽略不計,即可以當他們是常數(shù),這個式子的誤差 級別 y=ax+b(a,b 為常量),b=2*(sqrt(b*b+4)-2)/b 的誤差級別 y=a/x+b(a,b 為 常量),x在(0,1區(qū)間顯然后者的誤差比較大);調(diào)試程序的時候會遇到小錯誤,但經(jīng)過反復修改后程序能夠運行。設計體會和收獲。此次程序設計明白了對數(shù)據(jù)類型及其精度的重要性,有些科學研究需要高精度的 數(shù)據(jù),同時明白通向解決問題的道路是多種多樣的,我們應當用不同方向和方法 去解決問題。在我們解決不了問題的時候,要嘗試著去分析問題回歸問題的最基 本。七、參考資料,百度百科(祖沖之迭代法)楊克昌編著,計算機程序設計典型例題精解,國防科技大學

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論