2013-10-10 76 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)。)