C/C++

C++. Бинарный поиск. Объясните работу данной программы. Найдите такое число x, что , с точностью не менее 6 зн.С while

#include <iostream>
#include <cmath>
using namespace std;
const long double eps = 1e-10;
long double Z(long double x){
return x * x + sqrt(x);
}
int main(){
long double c;
long double left = 0;
long double right = 1e5;
long double middle;
cin >> c;
while (fabs(right - left) > eps) {
middle = (left + right) / 2.0;
if (Z(middle) - c < 0)
left = middle;
else
right = middle;
}
cout << fixed;
cout.precision(6);
cout << right;
return 0;
}
Temirlan Talgatov
Temirlan Talgatov
395
С точностью не менее 6 знаков что?
Эдуард Лукьянов
Эдуард Лукьянов
8 869
Лучший ответ
 #include 	//подключение библиотеки ввода вывода  
#include //подключение библиотеки математических функций

//Программа поиска корня уравнения y = x2 + корень из x
//на диапазоне значений y от left = 0 до right = 100 000
//Если на искомом диапазоне функция имеет неубывающий или невозрастающий график
//то можно разложить ее на отсортированную последовательность к которой применим
//бинарный поиск.

using namespace std;
const long double eps = 1e-10; //точность нахождения числа (не путать с точностью вывода на экран)
//по условию не менее шести знаков после точки т.е. это избыточная точность
long double Z(long double x)
{
return x * x + sqrt(x); //это наша функция
}
int main() {
long double c; //значение y для которого требуется найти х
long double left = 0; //нижняя граница поиска
long double right = 1e5; //верхняя граница поиска
long double middle; //средняя часть текущего дипазона (между двумя границами)
cin >> c; //вводим искомое значение функции
while (fabs(right - left) > eps) //Пока дистанция между границами поиска велика
//(превышает точность eps)
{
middle = (left + right) / 2.0; //делим текущие границы на две равные части точкой middle
if (Z(middle) - c < 0) //Если в этой точке подставленное значение х в функцию
//дает меньшее значение
left = middle; //то делаем нижней границей эту точку (отсекая все значени
//что были ниже.
else
right = middle; //Если большее значение, то отсекаем все значения выше этой точки
//делая эту точку верхней границей
//и повторояем цикл с новыми границами
}
cout
Арсений *******
Арсений *******
51 416

Похожие вопросы