2017-04-09 66 views
0

因此,我正在寫一個非常簡單的函數來使用reimann的總和在單位圓的四分之一上逼近pi的值。這是我的代碼:我的函數不返回任何東西;終端進入一些煉獄?

double pi_approx(unsigned int n) 
{ 
    double width = 1/n; 
    double sum = 0; 
    for(int i = 0 ; i <= 1 ; i += width) 
    { 
     sum += width * (1 - i * i); 
    } 
    return 4 * sum; 
} 

但是當我在我的終端上運行它時,它只是進入這種狀態,我可以只是鍵入什麼?那是什麼狀態,爲什麼我要進入它?我怎樣才能避免這種情況?

+0

我不明白。這是你編譯的文件中唯一的代碼?沒有入口點?發佈[mcve]。 – StoryTeller

+2

'i + = width'總是會導致'i',因爲它是整數運算。 – kaylum

+0

唯一的條目(在另一個文件中)是這樣的: int main(int argc,char * argv []) { pi_approx(25); } 作爲測試 –

回答

4

兩個問題,都是整數運算的結果。

  1. 由於kaylum在評論中指出。 i+=width不修改ii是一個整數和width < 1

  2. 1/n爲零,所以width爲零,您的循環變量永不更新。

因此,在考慮這些問題:

double pi_approx(unsigned int n) 
{ 
    double width = 1.0/n; // One double operand, so n is promoted. 
    double sum = 0; 
    for(double i = 0 ; i <= 1 ; i += width) 
    { 
     sum += width * (1 - i * i); 
    } 
    return 4 * sum; 
} 
+0

所有這些文字也應該是'double'而不是'int'。 IE:'double sum = 0.0;'和'for(double i = 0.0; i <= 1.0; i + = width)'和'sum + = width *(1.0 = i * 1);'最後'返回4.0 *總和;'取決於隱式轉換是獲得一些令人討厭的驚喜的好方法 – user3629249

相關問題