2013-10-30 98 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