今天是圓周率節,我們一起來用C++來求π吧!


 

前言

3.1415926535897932384626433832795…

不好意思,小編我只能被到這里了,當然我覺得做題只要3.14就夠了,沒必要背那么長的啊。。。當時我上小學時總是和同學們比背π,后來發現也沒什么必要哈~當時我們班有能背到100位的,還被我們膜拜了一番(雖然背到30幾位我們也不知道他是不是在亂說)。當然了,如果哪位想鍛煉以下記憶力的,你盡管背好了。(Haha)因為圓周率是一個無限不循環小數,既沒規律又背不完【嗚嗚】

當時,我們班有好些同學以為圓周率里是沒有0的(前二三十位確實沒有),后來大家才知道。。。我能背完的那些后面省略號的第一位就是0。。。【偷笑】


本文為EricNTH的原創博客,轉載請注明出處!

歡迎關注我的公眾號:Huayu_IT!里面有許多編程和計算機的有趣知識哦~


 

 


言歸正傳

好,我們開始吧。先從圓周率的定義說起吧~

圓周率(Pi)是圓的周長與直徑的比值,一般用希臘字母π表示,是一個在數學及物理學中普遍存在的數學常數。π也等於圓形之面積與半徑平方之比,是精確計算圓周長、圓面積、球體積等幾何形狀的關鍵值。在分析學里,π可以嚴格地定義為滿足sinx=0的最小正實數x。
——From: baike.baidu.com

我不想讓這篇文章變得枯燥,當然我相信圓周率的定義沒人不知道(幼兒園小朋友們除外),所以就不過多講述了喲~

π的歷史

π的歷史太久遠了,我們遠的不說,還是先來弘揚一下愛國主義精神吧~

中國古算書《周髀算經》的中有“徑一而周三”的記載,就是指π取3。漢朝時,張衡算出π約為10的平方根3.162。這個值不太准確,但它簡單易理解,容易記。別着急,厲害的在后面呢!

公元263年,三國時代魏國數學家劉徽用“割圓術”計算圓周率,他先從圓內接正六邊形,逐次分割一直算到圓內接正192邊形。“割之彌細,所失彌少,割之又割,以至於不可割,則與圓周合體而無所失矣。”(這句話很有名哦)。
這句話我們現在都能理解,但在當時可謂十分先進了。它包含了極限的思想。劉徽在得圓周率=3.14之后,將這個數值和當時的模型相比 ,發現3.14這個數值還是偏小。於是繼續割圓到1536邊形,求出3072邊形的面積,得到令自己滿意的圓周率:π約等於3.1416。(完全正確!4位了)

公元480年左右,南北朝時期的數學家祖沖之進一步得出精確到小數點后7位的結果,給出近似值3.1415926~3.1415927(哇!還是完全正確!7位了!),還得到兩個近似分數值,密率355/113(3.14159292)和疏率22/7(3.14285714)。密率是個很好的分數近似值哦,簡單易記又精確,想要再精確一點點,分子和分母就要上5位,誰記得住啊!看來,祖沖之對圓周率也是功不可沒啊!

好了,接下來的一千年中,沒有更精確的了~(太牛了!)

之后,阿拉伯數學家卡西在15世紀初求得圓周率17位精確小數值,打破祖沖之保持近千年的紀錄。(還是亞洲人聰明)

德國數學家魯道夫耗盡畢生心血於1610年算到小數后35位數,該數值被用他的名字稱為魯道夫數。(德國人嚴謹啊~)

后來人們開始利用無窮級數或無窮連乘(看到沒,都和無窮有關,還是劉徽牛啊)積求π,擺脫可割圓術的繁復計算。各種π值表達式紛紛出現,使得π值計算精度迅速增加。

第一個快速算法由英國數學家梅欽(John Machin)提出,1706年梅欽計算π值突破100位小數大關,他利用了如下公式:

到1948年英國的弗格森和美國的倫奇共同發表了π的808位小數值,成為人工計算圓周率值的最高紀錄。


還是計算機靠得住啊!
自從電子計算機發展以來,π的精度不斷增加~

。。。此處省略1萬字。。。

2011年10月16日,日本長野縣飯田市公司職員近藤茂利用家中電腦將圓周率計算到小數點后10萬億位,刷新了2010年8月由他自己創下的5萬億位吉尼斯世界紀錄。花費約一年時間。(用的只是家里自己裝的電腦哦,我也不知道那么久沒關機怎么搞的)


好了,你想不想學一學前輩,用自己家的電腦算一算圓周率呢?


用C++來算π

你不可能用電腦畫一個圓,然后連出它的直徑,然后讓電腦幫你除一除吧?

方法1

我們還是需要公式。

#include <bits/stdc++.h>
using namespace std;

int main(){
    short s=1;
    float pi=0;
    float i=1.0;
    float n=1.0;
    while(fabs(i)>=1e-6/){//即i不等於0,浮點數很多時候都需要這樣做。因為它使用的是科學計數法,多少也有點誤差。直接i!=0會出錯
        pi+=i;
        n=n+2;
        s=-s; 
        i=s*1.0/n;
    }
    pi=4*pi;
    printf("PI = %.6f\n",pi);
    
    return 0;
}

它用的公式是:

我們要的還是准確性啊,那我們來看看結果如何?

輸出:PI = 3.141594
不錯,如果你把精度調大一點,相信你也可以求到一萬位!


不過,這樣似乎又有點太做作了,
於是就有了——

方法2

反正你也可以背到二三十位嘛,那你為什么不定一個宏呢?
(不要臉中。。。)
不過不用勞煩您大駕了,<cmath>頭文件中已經幫你定義好了~

#define M_PI 3.14159265358979323846
#define M_PI_2 1.57079632679489661923
#define M_PI_4 0.785398163397448309616

當然,另一個無理數e,也有…

#define M_E 2.71828182845904523536
#define M_LOG2E 1.44269504088896340736
#define M_LOG10E 0.434294481903251827651

反正你實際用的時候M_PI就足夠了,就不用自己求了(哈)

好了,就講這些吧~

大家不要忘了,在3月14日15點9分26秒,捧上一個香噴噴的Pie,享用哦~
(麥當勞的派可能要被買爆了)

最后,祝大家圓周率節快樂~


本文為EricNTH的原創博客,轉載請注明出處!


Bye!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM