實驗4 超越祖沖之
簡介
中國數(shù)學(xué)家劉徽在注釋《九章算術(shù)》(公元263年)時只用圓內(nèi)接正多邊形就求得π的近似值,也得出精確到兩位小數(shù)的π值,他的方法被后人稱為割圓術(shù)。他用割圓術(shù)一直算到圓內(nèi)接正192邊形。
南北朝時代的數(shù)學(xué)家祖沖之(公元429年—公元500年)進一步得出精確到小數(shù)點后7位的π值(約5世紀(jì)下半葉),給出不足近似值3.1415926和過剩近似值3.1415927,還得到兩個近似分?jǐn)?shù)值,密率355/113和約率22/7。其中,密率在西方直到公元1573年才由德國人奧托得到,并于1625年發(fā)表于荷蘭工程師安托尼斯的著作中,歐洲稱之為安托尼斯率。
計算機的快速發(fā)展使π的精度越來越高,那么怎么通過計算機計算π值呢?在上一個實驗當(dāng)中,N個線段畫出了一個圓形,所以可以把這些線段的總長度除以圓的直徑,得出π的大小。
使用公式:
π=C /d
其中,C是圓的周長,d是圓的直徑。
在支持HTML5的瀏覽器里運行下面代碼:
<canvasid="myCanvas"width="480"height="300"style="border: 1px solid #c3c3c3;"> Your browser does not support the canvas element. </canvas> <scripttype="text/javascript"> var c=document.getElementById("myCanvas"); var cxt=c.getContext("2d"); var x=150; var y=150; var r=100; var girth=0; for (var i=x-r; i < x+r+1; i +=1) { var tempY1=Math.pow(r * r-(x-i) * (x-i), 1 / 2); \注:這里代表x坐標(biāo)\ cxt.lineTo(i, y+tempY1); var tempX=r * r-(x-i+1) * (x-i+1); var tempY2=Math.pow(r * r-(x-i+1) * (x-i+1), 1 / 2); \注:這里的+1代表下一個x坐標(biāo)\ var temp=getLengthOfTwoPoint({ x: i-1, y: tempY2 }, { x: i, y: tempY1 }); if (tempX >=0) { girth +=temp; } } alert("π的是值為:"+girth / r) function getLengthOfTwoPoint(startPoint, endPoint) { \注:用于求兩點之間的距離\ var calX=Math.abs(startPoint.x-endPoint.x); var calY=Math.abs(startPoint.y-endPoint.y); return Math.pow((calX * calX+calY * calY), 0.5); } </script>
上面的計算方法是把半個圓上的每段相鄰兩點之間的距離求和,然后除以r得出π的值。運行之后發(fā)現(xiàn)π的值為:3.1412985671602183,和標(biāo)準(zhǔn)的3.1415926535897932384626433 832795028841971693993751058209749相差甚遠(yuǎn)。
如何修改上面的代碼,提高精確度呢?數(shù)學(xué)家祖沖之得出了精確到小數(shù)點后7位,我們能超過他嗎?
因為是用的N條線段模擬圓,只要N越大,就越接近圓。所以可以增大半徑r,這樣需要的線段越多,求出的π就越接近標(biāo)準(zhǔn)值。將r增大至400000:
var c=document.getElementById("myCanvas"); var cxt=c.getContext("2d"); var x=150; var y=150; var r=400000; var girth=0; for (var i=x-r; i < x+r+1; i +=1) { var tempY1=Math.pow(r * r-(x-i) * (x-i), 1 / 2); cxt.lineTo(i, y+tempY1); var tempX=r * r-(x-i+1) * (x-i+1); var tempY2=Math.pow(r * r-(x-i+1) * (x-i+1), 1 / 2); var temp=getLengthOfTwoPoint({ x: i-1, y: tempY2 }, { x: i, y: tempY1 }); if (tempX >=0) { girth +=temp; } } alert("π的是值為:"+girth / r) function getLengthOfTwoPoint(startPoint, endPoint) { var calX=Math.abs(startPoint.x-endPoint.x); var calY=Math.abs(startPoint.y-endPoint.y); return Math.pow((calX * calX+calY * calY), 0.5); }
結(jié)果如圖1-18所示。

圖1-18 計算機計算的π值
可以看到,我們得到的π值小數(shù)點后前8位是準(zhǔn)確的。
- 大型網(wǎng)站架構(gòu)實戰(zhàn)
- 柳工出海:中國制造的全球化探索
- After Effects CS6從入門到精通
- Pro/ENGINEER三維造型設(shè)計實例精解
- jQuery+Bootstrap Web開發(fā)案例教程(在線實訓(xùn)版)
- CSS+DIV網(wǎng)頁樣式與布局案例指導(dǎo)
- 網(wǎng)頁制作與網(wǎng)站建設(shè)寶典
- Dreamweaver CC中文版網(wǎng)頁設(shè)計與制作從新手到高手
- HTML+CSS+JavaScript網(wǎng)頁制作案例教程(第2版)
- 中文版Dreamweaver CC+Flash CC+Photoshop CC網(wǎng)頁設(shè)計實戰(zhàn)視頻教程
- 人人都玩開心網(wǎng):Ext JS+Android+SSH整合開發(fā)Web與移動SNS
- 淘寶店鋪頁面設(shè)計與裝修實戰(zhàn)教程
- 中文版Dreamweaver CC+Flash CC+Photoshop CC網(wǎng)頁設(shè)計基礎(chǔ)培訓(xùn)教程
- 秩序之美:網(wǎng)頁中的網(wǎng)格設(shè)計
- Dreamweaver CC網(wǎng)頁設(shè)計從入門到精通(微課精編版)