Попытка найти sqrt чисел между 0 и 1 без функции sqrt

Проблема, которую я не могу решить, состоит в том, как я нахожу квадрат чисел между 0 и 1. После этого я думаю, что все работает. Единственные входные числа, которые приводят к сбою этой программы, это числа от 0(не включены) до 1(не включены)

Любая помощь?

#include <iostream>
#include <cmath>
#include <cassert>
#include <stdlib.h>
#include <cmath>

using namespace std;

double squareroot(double x)  /* computes the square root of x */

{
 assert( x >= 0 ); /* make sure x is not negative*/
 if (x==0) return 0;

/* the sqrt must be between xhi and xlo */
 double xhi = x;
 double xlo = 0;
 double guess = x/2;

/* We stop when guess*guess-x is very small */

 while (abs(guess*guess-x) > 0.00001 )
   {
     if (guess*guess > x)  xhi = guess;
     else xlo = guess;
     guess = (xhi + xlo)/2;
   }

 return guess;
 }

/* Test Stub */


int main()
 {
  double testvalue;
  cout << "\n Enter a TestValue= " ;
  cin >> testvalue;
  cout << endl;
  double testresult = squareroot(testvalue);
  cout << "\n Square Root= " << testresult << "\n" ;
  }

1 ответ

Ваша программа падает из-за этой строки:

while (abs(guess*guess-x) > 0.00001 )

Если у вас есть числа от 0 до 1, ваш алгоритм всегда будет иметь число больше 0,00001, что приведет к бесконечному циклу. Исправление будет состоять в том, чтобы либо изменить свой алгоритм на другой метод приближения квадратного корня (см. Метод Ньютона, теорему о неподвижной точке, методы полиномиального приближения и т. Д.).

Совет: попробуйте отследить свой код, чтобы увидеть, что происходит, даже если вам нужно записать его на бумаге

Другие вопросы по тегам