No more IE!請試著使用FirefoxGoogle Chrome等瀏覽器瀏覽
標頭的可愛Alaskan Malamute來自維基百科~

2009年8月15日 星期六

久違的C++,複習!

我發現NetBeans隨便開一個東西也要那麼久的確切原因了,因為他真的強!那個即時偵錯比我印象中的VB2005還要猛多了,而且他還沒VB那麼慢~~

來詳細說說我為啥會把腦筋動到NetBeans上吧。其實我這兩天在大氣系BBS上發現了生機系上個學期的C++作業,當然要寫寫看啊!而且前幾題還這麼蠢= =

做到第六題時卡住了,題目是...

請設計一個程式以下列級數計算pi值,並將結果輸出至螢幕上:

pi=4*(1-1/3-1/5+1/7.....)

Bonus point: 請嘗試比較用long double與float進行p值計算的差異,
你最多可以正確地計算p值到小數點幾位呢? 請討論之 (10%~30%)


看起來還是蠢蠢的,那行式子好像是費碼最後定理??
反正不過是加加減減,寫起來沒啥,可是這下我嘗到疏忽大意的後果了...
程式主幹如下,很乖的用for把數學翻譯成c++語法罷了:

double a=0;

for(int i=1;i<6666;i++)
{
if( i%2==1){ a=a+1/(2*i-1);}
if( i%2==0){ a=a-1/(2*i-1);}
}
a=a*4;


不過怎麼跑答案都是1,這樣根本無解啊!!!
有沒有熟練的已經看出問題出在哪了??

那時我是用gedit來打程式碼的(不知道的可以想像成WINDOWS的記事本,是同等級的東西,但gedit強多了,它看得懂不少種程式語言= =),然後再用g++編譯(當然是終端機XD)。弄了老半天,到處放cout,跑出來整個螢幕都是1......,這真是令人崩潰。

發文者的解答主要如下,我只能說她腦筋轉的快,不像我這麼蠢還用if:

int i ;
pia = 0 ;
pib = 0 ;

for (i=0 ; i<5000;i++){
pia=pia + pow(-1,i)/(2*i+1) ;
pib=pib + pow(-1,i)/(2*i+1) ;
}

pia = 4*pia ;
pib = 4*pib ;


不過這是有差很多嗎???為啥我的會錯?
有人看出來了嗎= =?

我火了,改成這樣:

double a=0;

for(double i=1;i<6666;i++)
{
if( i%2==1){ a=a+1/(2*i-1);}
if( i%2==0){ a=a-1/(2*i-1);}
}
a=a*4;


當然這樣不能編譯,double不可以算餘數,我這時突然想起強制轉換(好久以前的事了...)

double a=0;

for(double i=1;i<6666;i++)
{
if( int( i)%2==1){ a=a+1/(2*i-1);}
if( int( i)%2==0){ a=a-1/(2*i-1);}
}
a=a*4;


這樣就可喜可賀了~意思是我用int的話 a=a+1/(2*i-1)不知道會在哪自動四捨五入??

那為什麼她的就可以!?!?

沒有留言: