2011-04-21 4 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

+1

이것은 문제가 아니지만 while 비교는 약간 중복되어 있습니다. abs (right-left)> 2를 사용합니다. * e 트릭을 수행합니다 –

+0

무한 루프가있는'pf' 함수를 전달하고 있습니까? –

답변

1

나는 당신이 어디에 어떤 추적 하 고의 일부 printfs를 넣어 제안입니다.

+1

당신이있는 곳에서 디버거를 집어 들고 왜 – sehe

+1

+1을 추적 해보십시오. -0.5 C++ 응답에서'printf'를 제안했습니다. ''좋은 카르마에 대한 정리 :')' –

+0

apologies, old school, but thanks – ColWhi

2

나는 여러 독점 관계식<, <>

내가 에 그들 중 적어도 하나는 포함 (>= 또는 <=)

이 좋은 일반적인 규칙입니다 될 것으로 예상 참조 thumb (비교 값의 중간 증분과 같은 예외가 발생할 수 있으므로 ... 깨어 있어야합니다. 이것은 첫 번째 goot 규칙입니다)

+1

처음 두 개의'''의 목적은 음수를 검사하는 것이므로'<='는 의미가 없습니다. while 루프의'>'중 하나 (KWV에 의해 지적 된 바와 같이 하나는 중복 됨)는 오류 임계 값을 검사하는 데 사용되므로'>'는'e'가 0이 아닌 한 의미가 있습니다 * –

+1

이제 생각해 보니, 아마도 잘못된 것입니다 :') –

+0

시도해 보았습니다. <= – Technupe

0

디버그를 위해 -g 스위치를 제공하는 프로그램을 컴파일하고 gdb으로 실행하십시오. 그렇게하면 실수로 귀하의 do-while 상태가 참이되는 값을 알 수 있습니다.

관련 문제