sqrt в C/C++: квадратный корень

👋 Привет! В этой статье мы поговорим о функции sqrt. Эта функция позволяет нам вычислить квадратный корень в C/C++. Сначала мы посмотрим как использовать эту функцию на примере, а потом попробуем реализовать ее сами. Также мы разберемся чем отличается sqrt от sqrtl и sqrtf. В конце статьи вы найдете упражнения для закрепления материала.

Иллюстрация sqrt

Как получить корень числа в C/C++

Для того, чтобы вычислить квадратный корень числа в C/C++ мы можем воспользоваться встроенной функцией sqrt. Эта функция доступна нам после подключения файла <math.h>. В C++ можно подключить <cmath>. Вот как выглядит прототип этой функции:

double sqrt (double x);
  • Единственным аргументом функция принимает число, для которого нужно вычислить квадратный корень.
  • Возвращает функция квадратный корень переданного ей аргумента.

Давайте посмотрим на пример:

#include <cmath>
#include <iostream>

using namespace std;

int main() {
  cout << "sqrt(4) = " << sqrt(4) << endl;
  cout << "sqrt(1024) = " << sqrt(1024) << endl;
  cout << "sqrt(2) = " << sqrt(2) << endl;
  cout << "sqrt(0) = " << sqrt(0) << endl;
  cout << "sqrt(0.25) = " << sqrt(0.25) << endl;
  cout << "sqrt(-2) = " << sqrt(-2) << endl;

  return 0;
}

Вывод программы:

sqrt(4) = 2
sqrt(1024) = 32
sqrt(2) = 1.41421
sqrt(0) = 0
sqrt(0.25) = 0.5
sqrt(-2) = nan

Тут мы видим один интересный момент. Поскольку для отрицательных чисел невозможно получить квадратный корень, функция sqrt возвращает nan. Это нужно учитывать в ваших программах.

Что будет выведено на экран?

#include <iostream>
#include <cmath>

using namespace std;

int main() {
  double a = -49;
  cout << sqrt(a) << endl;

  return 0;
}
7
-7
0
nan

Как реализовать sqrt самому

Давайте попробуем реализовать функцию sqrt сами. Для этого мы воспользуемся бинарным поиском:

#include <cmath>
#include <iostream>

using namespace std;

double my_sqrt(double x) {
  // посчитать корень для отрицательного числа мы не можем
  if (x < 0) {
    return NAN;
  }

  // искать будем от нуля до x + 1
  // если x меньше единицы, то корень будет больше чем x, поэтому + 1
  double left = 0, right = x + 1;
  // количество итераций можно поменять, если нам нужна другая точность
  for (int i = 0; i < 20; i++) {
    double middle = (left + right) / 2;
    if (middle * middle < x) {
      left = middle;
    } else {
      right = middle;
    }
  }

  return left;
}

int main() {
  cout << "my_sqrt(4) = " << my_sqrt(4) << endl;
  cout << "my_sqrt(1024) = " << my_sqrt(1024) << endl;
  cout << "my_sqrt(2) = " << my_sqrt(2) << endl;
  cout << "my_sqrt(0) = " << my_sqrt(0) << endl;
  cout << "my_sqrt(0.25) = " << my_sqrt(0.25) << endl;
  cout << "my_sqrt(-2) = " << my_sqrt(-2) << endl;

  return 0;
}

Вывод:

my_sqrt(4) = 2
my_sqrt(1024) = 32
my_sqrt(2) = 1.41421
my_sqrt(0) = 0
my_sqrt(0.25) = 0.5
my_sqrt(-2) = nan

В программе выше, мы делаем двадцать итераций поиска. Количество итераций можно изменить как в большую, так и в меньшую сторону. Все зависит от того, какая точность вам нужна.

Функции sqrtl и sqrtf

Функции sqrtl и sqrtf, как и sqrt, вычисляют корень числа. Разница только в том, что они работают с вещественными числами long double (sqrtl) и float (sqrtf). Давайте посмотрим на пример:

#include <cmath>
#include <iostream>

using namespace std;

int main() {
  cout << "sqrtl(1234) = " << sqrtl(1234) << endl;
  cout << "sqrt (1234) = " << sqrt(1234) << endl;
  cout << "sqrtf(1234) = " << sqrtf(1234) << endl;

  return 0;
}

Вывод:

sqrtl(1234) = 35.1283
sqrt (1234) = 35.1283
sqrtf(1234) = 35.1283

Как вы можете видеть, они возвращают одно и то же число, просто другого типа.

Упражнения

  1. Использование sqrt:
    Напишите программу на C++, которая запрашивает у пользователя вещественное число, применяет к нему функцию sqrt и выводит результат. Ваша программа должна также выводить исходное число пользователя.

  2. Создание своей версии sqrt для float:
    Используя предоставленный в статье пример, создайте свою версию функции sqrt, но для чисел типа float. Проверьте ее работу, используя различные числа.

  3. Сравнение sqrt, sqrtf и sqrtl:
    Напишите программу, которая демонстрирует различия между sqrt, sqrtf и sqrtl. В вашей программе должны быть использованы все три функции, и результаты их работы должны выводиться на экран.

Обсуждение