2013-10-10 106 views
1

我想知道爲什麼在這個程序中,「pi_estimated」不會打印出小數位數,儘管該變量被聲明爲「雙」。但是,它會打印出一個整數。「雙」不打印小數

double get_pi(double required_accuracy) 
{ 
    double pi_estimation=0.0; 
    int x,y; 
    double p=0.0,q=0.0,r=0.0; 
    int D=0; 
    for(int N=1;N<=1e2;N++) 
    { 
     x = rand()%100; 
     p = (x/50.0 - 1.0)/100.0; 
     y = rand()%100; 
     q = (y/50.0 - 1.0)/100.0; 
     r = p*p + q*q; 
     if((sqrt(r))<1.0) 
     { 
      D++; 
      pi_estimation = 4.0*(double (D/N)); 
     } 
     if(double (4/(N+1)) < (required_accuracy*pi_estimation/100.0)) 
     { 
      cout<<pi_estimation<<endl; 
      return (pi_estimation); 
     } 
    } 
} 

int main() 
{ 
    double pi_approx=0.0, a, actual_accuracy=0.0; 
    for(a=0.1;a>=1e-14;a/=10) 
    { 
     pi_approx = get_pi(a); 
     actual_accuracy = (fabs((pi_approx - M_PI)/(M_PI)))*100.0; 
     cout<<actual_accuracy<<endl; 
    } 
} 
+0

因爲'double(D/N)'不是您想象的。打印出來,看看自己。 –

回答

6

這條線是罪魁禍首:

pi_estimation = 4.0*(double (D/N)); 

由於DN均爲int S,D/Nint。將int施放到double不可能讓魔術般地使小數不顯眼。

這裏的線路,固定:

pi_estimation = 4.0 * (((double) D)/N)); 

你也可以乘第一,所以你並不需要那麼多的括號:

pi_estimation = 4.0 * D/N; 

D被乘以4.0,因此它成爲double,因爲double * int = double。然後它除以N。由於(x * y)/z === x * (y/z)(關聯屬性),表達式是等效的。

1

的問題是在這裏:

pi_estimation = 4.0*(double (D/N)); 

DN均爲整數,所以D/N是你鑄造double,然後通過4.0乘以一個整數。

你想這樣做:

pi_estimation = 4.0 * (static_cast<double>(D)/N)); 
1

由於d和N都是整數類型,d/N是整數運算執行;由於在演員陣容之前失去了精準度,因此演員陣容加倍發生太遲。

一種修復方法是編寫4.0 * D/N。這將確保一切都以浮點計算。 (因爲*/具有相同的優先級,所以您不需要編寫(double)。)