// ====================================
// main function
int main(int argc, char **argv)
{
printf("PI = %lf
", PI);
printf("Euler_PI(100) = %lf
", Euler_PI(100)); // 睜開100項
printf("Leibniz_PI(100) = %lf
"翻譯社 Leibniz_PI(100)); // 展開100項
printf("Machin_PI = %lf
", Machin_PI());
printf("Monte_Carlo_PI(100000) = %lf
"翻譯社 Monte_Carlo_PI(100000)); // 一萬次隨機測試
至於Monte_Carlo的方式...嗯...那就留給列位評論了...
蒙地卡羅法求 PI,是個非常賭錢性的求法。
隨機抓一個點 (x翻譯社 y),判定 (x,y) 是否是在圓內,並隨機測試 N 次,在圓內的次數為 n 次,則 PI = 4 * (n/N)。
srand(time(NULL));
for(i=0; i<n ;i++){
x = rand() % MAX;
y = rand() % MAX;
if(x*x + y*y < (double)(MAX*MAX)) in_times++;
}
return (4.0 * (double)(in_times)/(double)(n));
}
// ====================================
// Euler: PI*PI / 6 = 1/1*1 + 1/2*2 + 1/3*3 +.......
結論很較著看得出來,使用Machin 的方法較簡單,而且也較其它方式準確、快!
程式碼
#define PI (double)(3.14159265)
至於其它的公式我就不再此贅述了..
但利用 Euler 等式求PI,其收斂性不佳。
}
// ====================================
// ====================================
// declare function
對於數學家和程式設計者,計算 PI 的準確度一向都是值得挑戰的問題翻譯華頓翻譯公司在此提出三個正常求PI的體式格局,及另一個感覺異常 Kuso 的求 PI 方式。再次強調,求 PI 的方法真的很是多,同時 paper 也有接續的更新,華頓翻譯公司供給的只是之前學者所研究出來的方式,實際上要算小數點後幾百、幾千、幾萬位數的 PI,請配合其它的演算法進行。
PI = 3.141593
Euler_PI(100) = 3.132077
Leibniz_PI(100) = 3.131593
Machin_PI = 3.141593
Monte_Carlo_PI(100000) = 3.279160
// ====================================
// Leibniz: PI = 4* (1/1 - 1/3 + 1/5 - 1/7 +....)
double Leibniz_PI(unsigned long n)
{
unsigned long i=0;
double ret = 0.0;
for(i=0; i<n; i++){
if(!(i%2)) ret = ret + 1.0/(double)(2*i+1);
else ret = ret - 1.0/(double)(2*i+1);
}
return (4.0*ret);
}
Leibniz 的求法其實不能算是准確,只能算是 "精簡",其準確度仍待商討,
同時收斂性和 Euler 一樣,也是欠安。
double Machin_PI(){
return (16*atan(1.0/5.0) - 4*atan(1.0 / 239.0));
}
Leibniz 求PI
歐拉(Euler)等式求PI
Kuso - Monte_Carlo 求 PI
後序
最後將附上程式碼,再與 google 上所附的 PI 值做比力。
// ====================================
// Machin: PI = 16*arctan(1/5) - 4*arctan(1/239)
輸出成果
這個式子應該是最簡單求 PI 的方式,只有一個式子,用不到 Loop,同時精準度也高翻譯
// ====================================
// FileName: PI.cpp
// Author : Edison.Shih.
// Complier: VC 2008
最後聲明,我不是數學家,公式的推導進程我並不清晰,但這些公式在網路上簡直不難找到,我只是將它試著用C語言實剛已作出來而已,如果有問題,也接待接頭一路評論辯論翻譯
媒介
Machin求PI
// ====================================
// Monte_Carlo_PI
double Monte_Carlo_PI(unsigned long n){
const unsigned MAX = 10000;
unsigned long i=0;
double x=0.0, y=0.0;
unsigned long in_times = 0;
double Euler_PI(unsigned long n);
double Leibniz_PI(unsigned long n);
double Machin_PI();
double Monte_Carlo_PI(unsigned long n);
double Euler_PI(unsigned long n){
unsigned long i=0;
double ret = 0.0;
for(i=1; i<=n; i++) ret += 1.0 / (double)(i*i);
return sqrt(ret*6.0);
}
固然,這個公式用 C 語言比力麻煩的是還要挪用 sqrt() 函數。此外近似這類公式的型式實在是多到不行,好比說:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h> // use Monte_Carlo_PI
本文來自: http://edisonshih.pixnet.net/blog/post/27945314-%5Bc%E8%AA%9E%E8%A8%80%E6%95%B8%E5%80%BC%E5%88%86%E6有關各國語文翻譯公證的問題歡迎諮詢華頓翻譯公司02-77260932