Пожалуйста, помогите мне выяснить, почему я нахожусь в бесконечном цикле? - PullRequest
2 голосов
/ 22 апреля 2011

это метод разделения пополам

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;
}

Ответы [ 3 ]

2 голосов
/ 22 апреля 2011

Я вижу несколько эксклюзивных реляций <, < и >

Я ожидаю, что по крайней мере один из них будет включительно (>= или <=)

Это хорошее общее практическое правило (возможны исключения, например, с промежуточными приращениями сравниваемых значений ... поэтому вам нужно бодрствовать, чтопервое эмпирическое правило goot)

1 голос
/ 22 апреля 2011

Я бы посоветовал поместить несколько printfs в то, чтобы отслеживать, где вы находитесь.

0 голосов
/ 04 апреля 2012

Скомпилируйте программу с ключом -g для отладки и запустите ее gdb .Таким образом, вы будете знать, для каких значений ваше do-while условие становится ошибочно.

...