2013-09-23 71 views
4

我試圖用泰勒級數計算ln(x)。這裏是我的代碼:沒有數學對數運算h

#define N 10 

float ln(float x){ 
    int i; 
    float result; 
    float xt; 
    float xtpow; 
    int sign; 
    if(x > 0 && x <= 1){ 
     xt = x - 1.0; 
     sign = -1; 
     xtpow = 1.0; 
     result = 0; 
     for(i = 1 ; i < N + 1; i++); 
     { 
      // Problem here 
      printf("%d\n", i); 
      sign = sign * (-1); 
      xtpow *= xt; 
      result += xtpow * sign/i; 
     } 
    }else if(x >= 1) 
    { 
     return -1 * ln(1.0/x); 
    } 
    return result; 
} 

問題是與我的系列週期(見上文)。看起來像1個週期後變量i變得相等N + 1,並且之後沒有任何變化。你有什麼想法,爲什麼這樣?

+1

我喜歡你在這裏調試的方法 - 你通過在每個循環中打印出值來放入一個「示蹤劑」 - 從而確定問題的確切位置。 Upvote從我! –

回答

5

好像i等於後1週期變量N + 1

刪除; for循環後:

for(i = 1 ; i < N + 1; i++); 
          ^

你的循環繼續執行,沒有你在大括號{ }推杆塊執行代碼for循環和for循環之後僅增加i直到循環休息。在循環代碼塊(您評論爲「問題在這裏」)之後,執行i = N + 1值。

我不確定,但我對if()中的條件表達式有其他疑問。你的代碼模式是這樣的:

if(x > 0 && x <= 1){ <-- "True for x == 1" 
    // loop code 
} 
else if(x >= 1){ <-- "True for x == 1" 
     // expression code here 
} 

所以對於x == 1其他代碼永遠不會執行。也檢查這個代碼。