2011-04-21 49 views
2

這是一個平分根法請幫我找出爲什麼我處於無限循環?

double p1::root(double (*pf)(double k), int a, int b, double e) { 

    // void nrerror(char error_text[]); 

    double left = (double)a; 
    double right = (double)b; 
    double midpoint; 

    do 
    { 
     midpoint = ((right+left)/2); 

     if(pf(left) *pf(midpoint) <0){ 
      right = midpoint; 
     } 
     else if(pf(right) * pf(midpoint) <0){ 
      left = midpoint; 
     } 
     else{ 
      break; 
     } 
    }while(abs(right-left) >2*e && abs(left-right)>e); 

    return midpoint; 
} 
+0

'pf','a','b'和'e'的值是什麼? – MSN 2011-04-21 23:04:56

+1

雖然這不是你的問題,但你的while比較有點多餘 - 只使用abs(右 - 左)> 2 * e的技巧 – 2011-04-21 23:07:02

+0

你是否傳遞了一個無限循環的「pf」函數? – 2011-04-21 23:10:46

回答

1

我建議把一些用printfs在做你身在何處的一些跟蹤。

+1

爲什麼不選擇調試器,而您正在使用 – sehe 2011-04-21 23:07:31

+1

+1來跟蹤你的位置。 -0.5,用於在C++答案中提示'printf'。爲了良好的業力':)' – 2011-04-21 23:17:06

+0

道歉,老學校,但是謝謝 – ColWhi 2011-04-22 00:42:11

2

我看到多個獨家relationals<<>

我希望他們來至少一個是包容>=<=

這是一個很好的一般規則拇指(例外情況可能發生,例如,比較值的中間增量...因此您需要保持清醒狀態,這是第一個有效的拇指規則)

+1

前兩個''的目的是檢查負數,所以'<='是沒有意義的。 while循環中的'>'(其中一個是多餘的,正如KWV指出的那樣)用於檢查錯誤閾值,所以'''只要'e'不爲零就可以了* – 2011-04-21 23:15:11

+1

其中,現在我想起來了,可能是出了什麼問題':)' – 2011-04-21 23:15:53

+0

請幫我解決這個問題,我試過<= – Technupe 2011-04-22 02:31:27

0

編譯該程序給-g開關進行調試並通過gdb運行。這樣你會知道什麼值是你的do-while條件成爲真正的錯誤。