c语言计算pi后1000位,计算圆周率 Pi (π)值, 精确到小数点后 10000 位
大家都知道π=3.1415926……無窮多位, 歷史上很多人都在計算這個數, 一直認為是一個非常復雜的問題。現在有了電腦, 這個問題就簡單了。
電腦可以利用級數計算出很多高精度的值, 有關級數的問題請參考《高等數學》,以下是比較有名的有關π的級數:
其中有些計算起來很復雜, 我們可以選用第三個, 比較簡單, 并且收斂的非常快。
因為計算π值, 而這個公式是計算π/2的, 我們把它變形:
π = 2 + 2/3 + 2/3*2/5 + 2/3*2/5*3/7 + …
對于級數, 我們先做個簡單測試, 暫時不要求精度:
用 C++ Builder 新建一個工程, 在 Form 上放一個 Memo1 和 一個 Button1, 在 Button1 的 OnClick 事件寫:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double x=2, z=2;
int a=1, b=3;
while(z>1e-15)
{
z = z*a/b;
x += z;
a++;
b+=2;
}
Memo1->Text = AnsiString().sprintf(“Pi=%.13f”, x);
}
按Button1在Memo1顯示出執行結果:
Pi=3.1415926535898
這個程序太簡單了, 而且 double 的精度很低, 只能計算到小數點后 10 幾位。
把上面的程序改造一下, 讓它精確到小數點后面 1000 位再測試一下:
在 Form 上再放一個按鈕 Button2, 在這個按鈕的 OnClick 事件寫:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
const ARRSIZE=1010, DISPCNT=1000; //定義數組大小,顯示位數
char x[ARRSIZE], z[ARRSIZE]; //x[0] x[1] . x[2] x[3] x[4] …. x[ARRSIZE-1]
int a=1, b=3, c, d, Run=1, Cnt=0;
memset(x,0,ARRSIZE);
memset(z,0,ARRSIZE);
x[1] = 2;
z[1] = 2;
while(Run && (++Cnt<200000000))
{
//z*=a;
d = 0;
for(int i=ARRSIZE-1; i>0; i–)
{
c = z*a + d;
z = c % 10;
d = c / 10;
}
//z/=b;
d = 0;
for(int i=0; i
{
c = z+d*10;
z = c / b;
d = c % b;
}
//x+=z;
Run = 0;
for(int i=ARRSIZE-1; i>0; i–)
{
c = x + z;
x = c%10;
x[i-1] += c/10;
Run |= z;
}
a++;
b+=2;
}
Memo1->Text = AnsiString().sprintf(“計算了 %d 次\r\n”,Cnt);
Memo1->Text = Memo1->Text + AnsiString().sprintf(“Pi=%d%d.\r\n”, x[0],x[1]);
for(int i=0; i
{
if(i && ((i%100)==0))
Memo1->Text = Memo1->Text + “\r\n”;
Memo1->Text = Memo1->Text + (int)x[i+2];
}
}
按 Button2 執行結果:
Pi=03.
141592653589793238462643383279502884197169399375105820974944 5923078164062862089986280348253421170679
821480865132823066470938446095505822317253594081284811174502 8410270193852110555964462294895493038196
442881097566593344612847564823378678316527120190914564856692 3460348610454326648213393607260249141273
724587006606315588174881520920962829254091715364367892590360 0113305305488204665213841469519415116094
330572703657595919530921861173819326117931051185480744623799 6274956735188575272489122793818301194912
983367336244065664308602139494639522473719070217986094370277 0539217176293176752384674818467669405132
000568127145263560827785771342757789609173637178721468440901 2249534301465495853710507922796892589235
420199561121290219608640344181598136297747713099605187072113 4999999837297804995105973173281609631859
502445945534690830264252230825334468503526193118817101000313 7838752886587533208381420617177669147303
598253490428755468731159562863882353787593751957781857780532 1712268066130019278766111959092164201989
這下心理有底了, 是不是改變數組大小就可以計算更多位數呢?答案是肯定的。
如果把定義數組大小和顯示位數改為:
const ARRSIZE=10100, DISPCNT=10000; //定義數組大小,顯示位數
執行結果精度可達 10000 位:
Pi=03.
141592653589793238462643383279502884197169399375105820974944 5923078164062862089986280348253421170679
821480865132823066470938446095505822317253594081284811174502 8410270193852110555964462294895493038196
442881097566593344612847564823378678316527120190914564856692 3460348610454326648213393607260249141273
724587006606315588174881520920962829254091715364367892590360 0113305305488204665213841469519415116094
330572703657595919530921861173819326117931051185480744623799 6274956735188575272489122793818301194912
983367336244065664308602139494639522473719070217986094370277 0539217176293176752384674818467669405132
000568127145263560827785771342757789609173637178721468440901 2249534301465495853710507922796892589235
420199561121290219608640344181598136297747713099605187072113 4999999837297804995105973173281609631859
502445945534690830264252230825334468503526193118817101000313 7838752886587533208381420617177669147303
598253490428755468731159562863882353787593751957781857780532 1712268066130019278766111959092164201989
380952572010654858632788659361533818279682303019520353018529 6899577362259941389124972177528347913151
… 限于篇幅, 這里就省略了, 還是留給你自己來算吧!
502014102067235850200724522563265134105592401902742162484391 4035998953539459094407046912091409387001
264560016237428802109276457931065792295524988727584610126483 6999892256959688159205600101655256375678
提高精度的原理:
以上程序的原理是利用數組把計算結果保存起來, 其中數組每一項保存10進制數的一位,
小數點定位在數組第1個數和第二個數之間, 即小數點前面2位整數, 其余都是小數位。
利用電腦模擬四則運算的筆算方法來實現高精度的數據計算,沒想到最原始的方法竟然是精度最高的。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的c语言计算pi后1000位,计算圆周率 Pi (π)值, 精确到小数点后 10000 位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言i o编程,C 语言输入输出 (I
- 下一篇: 用泰勒公式算sin cos用c语言,用泰