Программирование ручной функции квадратного корня?

Для моего класса я программирую функцию квадратного корня, используя включение. Нет, я не могу использовать любой другой метод …

Это мой код, программа почти работает. Он работает для идеальных квадратных корней и некоторых других значений (например, 11 или 5), но для других он попадает в бесконечный цикл (8, 2).

Причина, по которой это происходит, заключается в том, что верхняя и нижняя границы (b и a) не меняются. В идеале границы должны быть текущим x и предыдущим x, создавая новый x. То, что происходит, — то, что новый x в настоящее время сформирован текущим x и или a или b, будучи постоянной.

Я пытался так долго, но я еще не нашел способ «запомнить» или найти «предыдущий x», так как каждый раз, когда цикл while повторяется, только текущий x доступен для использования. Кто-нибудь знает, как можно решить такую ​​проблему?

void inclusion ()
{
double v ;
cout << "*** Now solving using Inclusion ***" << endl << "To calculate the square root, enter a positive number: " ;
cin >> v ;

while (v<0)
{
cout << "Square roots of negative numbers cannot be calculated, please enter a positive number: " ;
cin >> v ;
}

cout << endl ;

int n = 0;
while (v >= n*n)
n++ ;

double b = n ;
double a = n-1 ;

int t = 0 ;
double x = (a+b)/2 ;

while ((x * x - v >= 0.1) || (x * x - v <= -0.1))
{
t++ ;

if (x * x < v)
{
cout << "Lower Bound: " << x << '\t' << '\t' ;
cout << "Upper Bound: " << b << '\t' << '\t' ;
x = (b + x)/2 ;
cout << "Approximation " << t << ": " << x  << endl ;
}

else
{
cout << "Lower Bound: " << a << '\t' << '\t' ;
cout << "Upper Bound: " << x << '\t' << '\t' ;
x = (a + x)/2 ;
cout << "Approximation " << t << ": " << x  << endl ;
}
}

cout << endl << "The answer is " << x << ". Iterated " << t << " times." << endl << endl ;
}

0

Решение

Я еще не нашел способ «запомнить» или найти «предыдущий х»

Есть переменная previous_x что ты previous_x = x в конце цикла

Но это не твоя проблема. Вы меняете x, но нет a или же b, так что вы попадаете в бесконечно повторяющийся паттерн. Вместо этого вы должны отрегулировать, какой бы предел не привел вас к этому.

void inclusion ()
{
double v ;
cout << "*** Now solving using Inclusion ***" << endl << "To calculate the square root, enter a positive number: " ;
cin >> v ;

while (v<0)
{
cout << "Square roots of negative numbers cannot be calculated, please enter a positive number: " ;
cin >> v ;
}

cout << endl ;

int n = 0;
while (v >= n*n)
n++ ;

double b = n ;
double a = n-1 ;

int t = 0 ;

double x;
for (x = (a+b)/2; abs(x * x - v) >= 0.1; x = (a+b)/2, ++t)
{
if (x * x < v)
{
cout << "Lower Bound: " << x << '\t' << '\t' ;
cout << "Upper Bound: " << b << '\t' << '\t' ;
a = (b + x)/2 ;
cout << "Approximation " << t << ": " << x  << endl ;
}
else
{
cout << "Lower Bound: " << a << '\t' << '\t' ;
cout << "Upper Bound: " << x << '\t' << '\t' ;
b = (a + x)/2 ;
cout << "Approximation " << t << ": " << x  << endl ;
}
}

cout << endl << "The answer is " << x << ". Iterated " << t << " times." << endl << endl ;
}
2

Другие решения

Вам нужно обновить границы тоже:

a = x;
x = (b + x)/2;

а также

b = x;
x = (a + x)/2;
1

По вопросам рекламы [email protected]