Найти корень n-й степени из действительного числа
прошу помочь в решении следующей задачи.
Деление пополам Дано действительное число a и натуральное n. Вычислите корень n-й степени из числа a.
Для решения используйте метод деления отрезка пополам.
Входные данные:
На вход программе в первой строке подаётся действительное неотрицательное число a, не превосходящее 1000, заданное с точностью до 6 знаков после точки. Во второй строке — натуральное число n, не превосходящее 10.
Выходные данные:
Программа должна вывести единственное число — ответ на задачу с точностью не менее 4 знаков после точки.
Ввод: 2 2 Вывод: 1.41421356237
Код, который я использовал (3/32 тестов):
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double a, x_lower, x_upper, x_mid, epsilon;
int n;
cin >> a >> n;
epsilon = 0.0001;
x_lower = 0;
x_upper = a;
while (abs(x_lower - x_upper) >= epsilon) {
x_mid = (x_lower + x_upper) / 2;
if (pow(x_mid, n) > a) {
x_upper = x_mid;
} else {
x_lower = x_mid;
}
}
cout.precision(4);
cout << x_mid;
}
С этим кодом у меня не получается такого же числа точь-в-точь, почему — понять не могу. Изменял аргумент в предпоследней команде, числа на конце уже другие. Пожалуйста, помогите!
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double a, x_lower, x_upper, x_mid, epsilon;
int n;
cin >> a >> n;
epsilon = 1e-5;
x_lower = 0;
x_upper = a < 1 ? 1 : a;
while (abs(x_lower - x_upper) >= epsilon) {
x_mid = (x_lower + x_upper) / 2;
if (pow(x_mid, n) > a) {
x_upper = x_mid;
} else {
x_lower = x_mid;
}
}
cout.precision(6);
cout << fixed;
}
Ответы (4 шт):
precision(4) - выводит количество символов, не считая впереди идущих нулей.
Это сработает, если число в "классическом" виде - не ноль в разряде целых и сколько-то цифр после запятой. Причем последняя цифра округляется (если число длиннее). Это не совсем точность в количестве символов после запятой.
Поиграйте с выводом форматов и посмотрите сами. Просто посмотреть проще, чем объяснить.
cout.precision(4);
cout << 0.000123456 << "\n";
cout << 0.0123456 << "\n";
cout << 0.123456 << "\n";
cout << 1.23456 << "\n";
double Degree(double x, unsigned int a);
bool Bisec(double x, unsigned int a, double &Result);
int main()
{
double x;
double y;
unsigned int a;
std::cin>>x;
std::cin>>a;
if (Bisec(x, a, y));
{
std::cout<<y<<std::endl;
}
else
{
std::cout<<"Не могу найти корень."<<std::endl;
}
return 0;
}
double Degree(double x, unsigned int a)
{
double Result=1.0;
unsigned int i;
for (i=1; i<a; ++i)
{
Result*=x;
}
return Result;
}
bool Bisec(double x, unsigned int a, double &Result)
{
double Left;
double Right;
double yl;
double y;
double yr;
bool Flag=true;
if ((x>-1.0)&&(x<1.0))
{
Left=-1.0;
Right=1.0;
}
else
{
if (x<0)
{
Left=x;
Right=-x;
}
else
{
Left=-x;
Right=x;
}
}
Result=((Left+Right)/2.0);
while (Flag&&((Right-Left)>0.25))
{
Result=((Left+Right)/2.0);
yl=((Degree(Left, a))-x);
y=((Degree(Result, a))-x);
yr=((Degree(Right, a))-x);
if ((ly*y)<0.0))
{
Right=Result;
}
else
{
if ((y*yr)<0.0))
{
Left=Result;
}
else
{
Flag=false;
}
}
}
Result=((Left+Right)/2.0);
}
там просто epsilon надо присвоить 1e-6.
и cout << fixed << x_upper;