誰會寫圓周率的C++程式請幫幫我

2009-10-22 11:38 pm
名稱:計算圓周率
指示 已知PI/4=1-1/3+1/5-1/7+.......

請寫一個程式,盡可能精確計算出圓周率PI

回答 (4)

2009-10-23 7:14 am
✔ 最佳答案
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
double pi = 0, d;
int i = 1;
while ((d = 1./i - 1./(i+2)) > 1e-16)
{
pi += d ;
i += 4;
}

cout << "PI = 4 * ( 1 + 1/3 - 1/5 ... - 1/" << i-2 << " ) = "
<< setprecision(15) << pi*4 << "\n";

system("pause");
return 0;
}

/*
PI = 4 * ( 1 + 1/3 - 1/5 ... - 1/141421355 ) = 3.14159263920448
由結果可知,本例的公式收斂不佳。
*/


圖片參考:http://imgcld.yimg.com/8/n/AF02803765/o/100910220405613869272340.jpg


2009-10-22 23:23:56 補充:
請修改底下兩處,可改善結果的精確度:
1.把 while ((d = 1./i - 1./(i+2)) > 1e-16)
改成 while ((d = 4./i - 4./(i+2)) > 1e-16)
2.把 cout 述句中的 pi*4 改成 pi

如此,執行結果變成
PI = 4 * ( 1 + 1/3 - 1/5 ... - 1/282842711 ) = 3.14159264457184

2009-10-23 11:20:29 補充:
計算的過程沒錯,但顯示結果的式子忙中有誤,
請把 cout 述句中的 ... 1 + 1/3 - 1/5 ...改成... 1 - 1/3 + 1/5 ...
2009-10-29 3:34 pm
用同樣的公式:

同樣算到 -1 / 2828427,
       時間  誤差
第一位回答者  453 7.07106535546842e-7
第二位回答者   31 7.07106451613981e-7
第二位回答者 速度快 14.6倍 誤差較差



同樣算到 -1 / 28284271,
       時間  誤差
第一位回答者 5125 2.22120153381411e-8
第二位回答者  281 7.07053611215258e-8
第二位回答者 速度快18.2倍 誤差少 3.18倍

2009-10-29 07:34:19 補充:
同樣算到 -1 / 282842711,
       時間  誤差
第一位回答者 57281 5.96046922929361e-8
第二位回答者  2750 9.01357743998688e-9
第二位回答者 速度快20.8倍 誤差少 6.61倍

2009-10-29 07:35:37 補充:
第一組數據,是
第二位回答者 速度快 14.6倍 誤差較少
不是
第二位回答者 速度快 14.6倍 誤差較差
2009-10-23 11:34 pm
pow 不是個快速函式!
不應在此使用!!



這個公式本身有個死角,
造成一些本來會更準的算法,
在 double 的有效範圍內,失去它的效果!

所以,東邪的說法極為正確!!


也因此,東邪的做法雖非最準;
但已極接近敝人所知最準的做法所出的答案。
2009-10-23 4:11 am
//Headers and Macros
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <iomanip>

#define MAX_ITEM 1000000

using namespace std;

//Main Function
void main(int argc, char** argv)
{
//==START==//
//以下另一個方法
//高中數學:反三角函數
double PI = ::acos(-1.0f);
cout<<"arccos(-1) = "<<PI<<endl;
//以下是你要的公式方法
double pi = 0;
for ( int i = 0; i < MAX_ITEM; i ++)
{
pi += ::pow( (-1.0f), i) / (2 * i + 1);
}
pi *= 4;
cout<<"Your PI is "<<setprecision(15)<<pi<<endl;
//==END==//
system("PAUSE");
return;
}


收錄日期: 2021-04-28 23:09:05
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20091022000010KK04056

檢視 Wayback Machine 備份