2013-10-30 61 views
1

我想计算一个球的半径,如果我有4195065486 mm2面积和1 mm厚度的皮革,从半径为1 mm的小球开始,制造商可以将皮革包裹在球。我编写了这个代码来获得可以制作的球的半径以及皮革的剩余区域。 (假设pi = 3.14159)。是否有任何截断?

double A, r; 
const double pi=3.14159; 
double AreaCalc(double r); 
int main(){ 

    A=4195065486.0; 
    r=1.0; 
    double final_r = AreaCalc(r); 
    cout<<final_r<<" "<<A<<" "<<endl; 
    return 0; 
} 

double AreaCalc(double r){ 
    double ca; 

    ca=4*pi*r*r; 
    if (A-ca>=0.0){ 

     A=A-ca; 
     AreaCalc(r+1); 
    } 
    else return r; 
} 

是否有可能导致A不准确结果的截断或影响? 通过调试我可以得到A = 12559904.940002432。

+1

什么是你的输出和你有什么期望? – Sambuca

+1

如果你打算使用双精度,那么你应该至少使用π的适当精确值 - 最好使用''中的'M_PI'。 –

+0

@PaulR:这个问题假设pi = 3.14159不少于或者更多。 – Aan

回答

3

您在if分支中缺少return,导致未定义的行为。
添加:

return AreaCalc(r+1); 

你应该已经得到了一个编译器警告。
如果您没有,请提高您的警告级别。
如果你这样做,开始注意警告。您的编译器的“将警告视为错误”选项是非常健康的选择。

(但是,像@Henrik建议在评论中,数学是最好的解决方案。)

+2

远离背景的神秘回声:“编译并启用警告...!警告启用...!启用...!引导...!” – 2013-10-30 08:38:26