Попытка найти 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, что приведет к бесконечному циклу. Исправление будет состоять в том, чтобы либо изменить свой алгоритм на другой метод приближения квадратного корня (см. Метод Ньютона, теорему о неподвижной точке, методы полиномиального приближения и т. Д.).
Совет: попробуйте отследить свой код, чтобы увидеть, что происходит, даже если вам нужно записать его на бумаге