1

我想知道为什么在这个程序中,“pi_estimated”不会打印为带小数位的数字,尽管变量被声明为“double”。但是,它打印出一个整数。

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;
    }
}
4

3 回答 3

6

这条线是罪魁祸首:

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

因为DN都是ints,D/N所以是int。将 a转换int为 adouble不能神奇地使小数突然出现。

这是固定的线:

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)(关联属性),表达式是等价的。

于 2013-10-10T20:55:37.630 回答
1

问题在这里:

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

DN都是整数,所以D/N你要转换为双精度然后乘以 的整数也是如此4.0

你想这样做:

pi_estimation = 4.0 * (static_cast<double>(D) / N));
于 2013-10-10T20:56:50.863 回答
1

由于 D 和 N 都是整数类型,所以 D/N 是在整数运算中进行的;演员加倍发生得太晚了,因为在演员之前失去了精度。

一种解决方法是编写4.0 * D / N. 这将确保一切都以浮点数计算。(因为*/具有相同的优先级,所以你不需要写(double)。)

于 2013-10-10T20:57:06.570 回答