版權申明:本文為博主窗戶(Colin Cai)原創,歡迎轉帖。如要轉貼,必須注明原文網址 http://www.cnblogs.com/Colin-Cai/p/8367610.html 作者:窗戶 QQ:6679072 E-mail:6679072@qq.com
現代數學是建立在公理化的體系之上,可以認為是形而上學。公理化是數學的本質所在,古代中國人建立過數學的輝煌,但是卻似乎並沒有去思考數學的本質,而古希臘的《幾何原本》是人類有史以來記載的最早數學往公理化方向努力,盡管《幾何原本》中存在着公理的不完備,證明過程中依然有”想當然“的成分,比如直線上除某點之外的一點(幾何原本中並沒有公理支持直線上除了某點之外還可以取一點),但是往公理化運行的這個歷史意義巨大。
很長時間,我都不太認為古代數學有哪些驚人,只是還知道勾股定理,楊輝三角,以及祖沖之算圓周率等。
今天老婆問我圓周率怎么算的,我就想了想。雖然圓周率可以有一堆無窮級數或者無窮乘積可以表示,我還是選擇了用最簡單的方式來回答,於是就直接行動起來吧。
選擇一個單位圓,x2+y2=1,它的面積就是pi,於是用微積分逼近的方法來做,分成n等分,然后用上和或者下和逼近。當然要考慮精度問題,所以還是用上bc這個任意精度計算器,這個計算器我一直很喜歡使用,一邊跟老婆解釋一邊寫程序,程序很快寫完。
scale = 12;/*所有計算精度小數點后12位*/ n = 10^6;/*單位圓切200萬刀,y軸左右各100萬刀*/ pi = 0;/*上和累計初始值為0*/ for(i=0;i<n;i++) { x = i/n;/*x坐標*/ y = sqrt(1-x^2);/*y坐標*/ s = 4*y/n;/*此塊上和,4個象限對稱4份*/ pi = pi+s;/*累和進去*/ } print "pi = ", pi, "\n";/*最終打印出累和出來的圓周率*/
用bc運行一下,我的虛擬機24秒后有了結果。
# time bc <2 pi = 3.141594151717 real 0m24.015s user 0m24.006s sys 0m0.008s
結果並不是很理想,計算精度12位其實只是影響了一點點累和時的精度問題,完全不是祖沖之的3.14159265級別的問題。
於是換條路吧,祖沖之的割圓術應該是對周長的,於是我就分它個215=32768份,成為一個32768邊形,邊長其實是2*sin(2*pi/32768),我們就來算這個值吧。sin(2x)=2sin(x)*cos(x),因為是銳角,可算出sin(x)=sqrt((1-sqrt(1-cos(2x)*cos(2x)))/2)。
繼續用bc來寫,
n=13;/*從圓的內接正方形開始,開始對切13次*/ scale=20;/*紀念20位足夠*/ s=sqrt(2)/2;/*sin(pi/4)*/ for(i=0;i<n;i++) { s = sqrt((1-sqrt(1-s^2))/2);/*一個個的推*/ } print "pi = ", 4*s*2^n, "\n";/*打印圓周率*/
運行一下,這次對於計算機就很快了,長度法比面積法靠譜,
# time bc <3 p = 3.14159264877598965760 real 0m0.007s user 0m0.004s sys 0m0.004s
可是,精度還差那么一點,看來應該多切一刀,把程序中的n改成14,精度符合要求。
# time bc <3 p = 3.14159265238350561280 real 0m0.005s user 0m0.000s sys 0m0.004s
這樣的開平方運算用手算是很復雜的,參考我的博文《平方根的C語言實現(二) —— 手算平方根的原理》,我無法想像祖沖之如何面對這么復雜的運算的。中國古人雖然可能對於數學的基本原理沒有做深層次的考慮(不排除以前考慮過,但資料丟失的可能,畢竟經過了嬴政和劉徹和那么多的朝代),但至少古人的計算能力真的是很讓人震撼。
