sqrt в C/C++: квадратный корень
👋 Привет! В этой статье мы поговорим о функции sqrt
. Эта функция позволяет нам вычислить квадратный корень в C/C++. Сначала мы посмотрим как использовать эту функцию на примере, а потом попробуем реализовать ее сами. Также мы разберемся чем отличается sqrt
от sqrtl
и sqrtf
. В конце статьи вы найдете упражнения для закрепления материала.
Как получить корень числа в 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;
}
Как реализовать 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
Как вы можете видеть, они возвращают одно и то же число, просто другого типа.
Упражнения
-
Использование
sqrt
:
Напишите программу на C++, которая запрашивает у пользователя вещественное число, применяет к нему функциюsqrt
и выводит результат. Ваша программа должна также выводить исходное число пользователя. -
Создание своей версии
sqrt
дляfloat
:
Используя предоставленный в статье пример, создайте свою версию функцииsqrt
, но для чисел типаfloat
. Проверьте ее работу, используя различные числа. -
Сравнение
sqrt
,sqrtf
иsqrtl
:
Напишите программу, которая демонстрирует различия междуsqrt
,sqrtf
иsqrtl
. В вашей программе должны быть использованы все три функции, и результаты их работы должны выводиться на экран.
Если хотите всегда быть в курсе последних новостей в мире программирования и IT, подписываетесь на мой Telegram-канал, где я делюсь свежими статьями, но востями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение