來詳細說說我為啥會把腦筋動到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)不知道會在哪自動四捨五入??
那為什麼她的就可以!?!?
沒有留言:
張貼留言