1

このプログラムでは、変数が「double」として宣言されているにもかかわらず、「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;
    }
}
4

3 に答える 3

6

この行が犯人です:

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

DNは両方ともであるためintD/Nintです。intを a にキャストしても、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)(連想プロパティ) であるため、式は同等です。

于 2013-10-10T20:55:37.630 に答える