求圓周率π的幾種方法,圓周率π幾種方法
方法1:機率法求π的近似值。
機率法又稱蒙特卡羅法。假設有一個半徑為1的圓,則四分之一圓的面積等於1/4π。通過機率法計算出四分之一圓的面積,也就得到了1/4π。具體過程為:利用隨機函數產生橫座標x和縱座標y(兩個值在0~1之間),接著判斷由這兩個隨機數構成的點是否位於1/4圓的地區內,若該點位於1/4圓內則進行計數。由於隨機函數產生的點座標有一定的均勻性,當產生的點足夠多時,就可得到陰影內和陰影外點的近似均勻分布。
#include <stdio.h>#include <stdlib.h>#include <time.h>int main(void){int n, sum = 0;double x, y;printf("請輸入焦點的數量:");scanf("%d", &n);srand((unsigned)time(NULL));for (int i = 1; i < n; i++){x = (double)rand() / RAND_MAX;y = (double)rand() / RAND_MAX;if (x * x + y * y <= 1){sum += 1;}}printf("PI = %f\n", (double)4 * sum / n);return 0;}
方法2:割圓法求π的近似值。
割圓法利用圓的內接多邊形來逼近圓的周長。通過不斷地將內接多邊形進行切割劃分,使其無限逼近圓周,則可得到精確度更高的π值。
#include <stdio.h>#include <math.h>int main(void){double x = 1, PI;int count, n = 0;int s = 6;//初始內接圓邊數printf("請輸入割圓次數:");scanf("%d", &count);while (n <= count){printf("第%d次割圓,內接正%d邊形:", n, s);PI = s * x / 2;printf("PI = %.12f\n", PI);x = sqrt(2 - sqrt(4 - x * x));s *= 2;n += 1;}return 0;}
方法3:公式法求π的近似值。
利用以下公式可方便計算π的近似值。π=2+2/3+2/3×2/5+2/3×2/5×3/7+2/3×2/5×3/7×4/9+⋯
#include <stdio.h>int main(void){double temp = 2, PI = 2;int a = 1, b = 3;//a為分子,b為分母while (temp > 1e-20){temp *= (double)a / b;PI += temp;a += 1;b += 2;}printf("PI = %.12f\n", PI);return 0;}
注意:程式中需要根據精度要求結束迴圈。
方法4:計算任意位元的π。
方法1至方法3計算出來的π值,由於使用單變數儲存結果,限於電腦硬體對變數的表示範圍有限,因此,最多隻能計算出π值小數點後十多位。為了提高精度,可定義數組來逐位儲存無限迴圈小數,基本思路仍然是利用方法3的公式法。
#include <stdio.h>#include <stdlib.h>int main(void){char *temp, *pi;int decLen;//小數位元int a = 1, b = 3;//分子分母int result, i, carry;int count = 0, flag = 1;//計算次數printf("請輸入π的小數位元:");scanf("%d", &decLen);decLen += 2;if (!(temp = (char *)malloc(sizeof(char) * decLen))){return 0;}if (!(pi = (char *)malloc(sizeof(char) * decLen))){return 0;}for (i = 0; i < decLen; i++){*(pi + i) = 0;*(temp + i) = 0;}pi[1] = 2;//初始化值temp[1] = 2;while (flag && ++count < 1e6){carry = 0;for (i = decLen - 1; i >= 0 ; i--){result = temp[i] * a + carry;temp[i] = result % 10;carry = result / 10;}carry = 0;for (i = 0; i < decLen; i++){result = temp[i] + carry * 10;temp[i] = result / b;carry = result % b;}flag = 0;for (i = decLen - 1; i > 0; i--){result = pi[i] + temp[i];pi[i] = result % 10;pi[i - 1] += result / 10;flag |= temp[i];}a += 1;b += 2;}printf("計算了:%d次\n", count);printf("PI = %d.", pi[1]);//輸出個位和小數點for (i = 2; i < decLen; i++){if ((i > 2) && (i - 2) % 10 == 0){printf(" ");}if ((i > 2) && (i - 2) % 50 == 0){printf("\n");}printf("%d", pi[i]);}printf("\n");return 0;}
注意:終止迴圈的條件是:數組temp中全部為0,即已經沒有餘數需要處理。如果數組中元素一直不為0,則還需要設定另外的條件來終止迴圈,如規定迴圈處理次數。
圓周率π的計算方法有什?它們各自有什優缺點?
古人計算圓周率,一般是用割圓法。即用圓的內接或外切正多邊形來逼近圓的周長。阿基米德用正96邊形得到圓周率小數點後3位的精度;劉徽用正3072邊形得到5位精度;魯道夫用正262邊形得到了35位精度。這種基於幾何的演算法計算量大,速度慢,吃力不討好。隨著數學的發展,數學家們在進行數學研究時有意無意地發現了許多計算圓周率的公式。下面挑選一些經典的常用公式加以介紹。除了這些經典公式外,還有很多其它公式和由這些經典公式衍生出來的公式,就不一一列舉了。
1、馬青公式
π=16arctan1/5-4arctan1/239
這個公式由英國天文學教授約翰·馬青於1706年發現。他利用這個公式計算到了100位的圓周率。馬青公式每計算一項可以得到1.4位的十進位精度。因為它的計算過程中被乘數和被除數都不大於長整數,所以可以很容易地在電腦上編程實現。
還有很多類似於馬青公式的反正切公式。在所有這些公式中,馬青公式似乎是最快的了。雖然如此,如果要計算更多的位元,比如幾千萬位,馬青公式就力不從心了。
2、拉馬努金公式
1914年,印度天才數學家拉馬努金在他的論文裡發表了一系列共14條圓周率的計算公式。這個公式每計算一項可以得到8位的十進位精度。1985年Gosper用這個公式計算到了圓周率的17,500,000位。
1989年,大衛·丘德諾夫斯基和格雷高裡·丘德諾夫斯基兄弟將拉馬努金公式改良,這個公式被稱為丘德諾夫斯基公式,每計算一項可以得到15位的十進位精度。1994年丘德諾夫斯基兄弟利用這個公式計算到了4,044,000,000位。丘德諾夫斯基公式的另一個更方便於電腦編程的形式是:
3、AGM(Arithmetic-Geometric Mean)演算法
高斯-勒讓德公式:
圓周率的計算方法是什?有多少種計算方法?
周長 πd 面積πr的平方
3.14