我想知道为什么在这个程序中,“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;
}
}
答案 0 :(得分:6)
这条线是罪魁祸首:
pi_estimation = 4.0*(double (D/N));
由于D
和N
都是int
,D/N
是int
。将int
投射到double
无法神奇地使小数无处不在。
这是固定的行:
pi_estimation = 4.0 * (((double) D) / N));
你也可以先增加,所以你不需要那么多的parens:
pi_estimation = 4.0 * D / N;
D
乘以4.0
,因此double
成为double * int = double
。然后除以N
。由于(x * y) / z
=== x * (y / z)
(关联属性),表达式是等价的。
答案 1 :(得分:1)
问题在于:
pi_estimation = 4.0*(double (D/N));
D
和N
都是整数,因此D/N
是一个整数,您将其转换为double,然后乘以4.0
。
你想这样做:
pi_estimation = 4.0 * (static_cast<double>(D) / N));
答案 2 :(得分:1)
由于D和N都是整数类型,因此D / N以整数运算执行;由于精确度在演员阵容之前失去,所以演员要加倍发生。
一个解决方法是编写4.0 * D / N
。这将确保一切都以浮点计算。 (由于*
和/
具有相同的优先级,因此您无需编写(double)
。)