Найти корень n-й степени из действительного числа

Рейтинг: 0Ответов: 4Опубликовано: 26.01.2023

прошу помочь в решении следующей задачи.

Деление пополам Дано действительное число 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;
}

Ответы

▲ 1

precision(4) - выводит количество символов, не считая впереди идущих нулей.
Это сработает, если число в "классическом" виде - не ноль в разряде целых и сколько-то цифр после запятой. Причем последняя цифра округляется (если число длиннее). Это не совсем точность в количестве символов после запятой.
Поиграйте с выводом форматов и посмотрите сами. Просто посмотреть проще, чем объяснить.

    cout.precision(4);
    cout << 0.000123456 << "\n";
    cout << 0.0123456 << "\n";
    cout << 0.123456 << "\n";
    cout << 1.23456 << "\n";
▲ 0

попробуй
cout << fixed << setprecision(3) << x_mid;

▲ 0
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);
}
▲ 0

там просто epsilon надо присвоить 1e-6.

и cout << fixed << x_upper;