Извлечение корня в Python

Извлечение корня в Python Полезное

Извлечение корня в Python — это операция, обратная возведению в степень: квадратный корень из числа A это такое число B, что B в квадрате равно A. В Python для этого есть готовые инструменты, и выбор зависит от задачи: нужен приблизительный результат или точное целое, корень квадратный или n-й степени, число положительное или отрицательное.

Ниже разберу все рабочие способы: функцию math.sqrt, оператор ** 0.5, целочисленный math.isqrt, корень произвольной степени и корень из отрицательных чисел через модуль cmath. Весь код прогнан на Python 3, вывод в комментариях — фактический.

Как выбрать способ

Быстрый ориентир, чтобы не читать всю статью:

Задача Что взять Тип результата
Квадратный корень, обычные вычисления math.sqrt(x) float
Корень без импорта модуля x ** 0.5 float
Целая часть корня из целого (без float) math.isqrt(x) int
Корень n-й степени x ** (1/n) float
Корень из отрицательного числа cmath.sqrt(x) complex

Дальше — каждый способ с примером и разбором границ применимости.

math.sqrt: основной способ для квадратного корня

Функция sqrt живет в модуле math из стандартной библиотеки, поэтому модуль сначала импортируют. Функция принимает одно число и возвращает его квадратный корень типом float:

import math

print(math.sqrt(16))   # 4.0
print(math.sqrt(2))    # 1.4142135623730951

Вывод:

4.0
1.4142135623730951

Обратите внимание: даже для точного квадрата результат приходит с плавающей точкой — 4.0, а не 4. Это нормально: math.sqrt всегда возвращает float. Проверить результат можно обратной операцией — возведением в квадрат: 4.0 ** 2 даст 16.0.

Функция работает с целыми и вещественными неотрицательными числами. На отрицательном аргументе она не возвращает комплексное число, а останавливает программу ошибкой — про это отдельный раздел ниже.

Оператор ** 0.5: корень без импорта

Возведение в степень одна вторая математически равно извлечению квадратного корня. В Python это оператор **, а показатель степени 0.5:

print(16 ** 0.5)     # 4.0
print(2 ** 0.5)      # 1.4142135623730951
print(pow(16, 0.5))  # 4.0

Вывод:

4.0
1.4142135623730951
4.0

Результат совпадает с math.sqrt, а импорт не нужен — удобно для короткого скрипта. Встроенная функция pow(x, 0.5) делает то же самое, что оператор. Тип результата снова float: 16 ** 0.5 это 4.0, а не 4. Для больших значений math.sqrt обычно точнее и читается яснее, поэтому в расчетах чаще берут именно ее, а ** 0.5 — для разовых прикидок.

math.isqrt: целочисленный корень

Когда нужен именно целый результат без плавающей точки — например, для счетчиков, индексов или проверки на точный квадрат, — подходит math.isqrt. Она возвращает целую часть квадратного корня (округление вниз) и работает только с целыми неотрицательными числами:

import math

print(math.isqrt(16))  # 4
print(math.isqrt(17))  # 4
print(math.isqrt(15))  # 3

Вывод:

4
4
3

Из 17 и из 15 точного корня нет, поэтому функция отбрасывает дробную часть: для 17 это 4 (потому что 4 в квадрате = 16, а 5 в квадрате = 25 уже больше), для 15 это 3.

Отсюда удобная проверка, является ли число точным квадратом: возвести целый корень обратно в квадрат и сравнить с исходным числом.

import math

n = 17
r = math.isqrt(n)
print(r, r * r == n)  # 4 False

Вывод:

4 False

Для 17 получаем False — точного квадрата нет. Такой способ надежнее, чем сравнивать math.sqrt(n) с округленным значением: isqrt работает с целыми числами и не зависит от погрешности float. Функция доступна начиная с Python 3.8.

Корень n-й степени

Кубический корень, корень четвертой степени и любой другой считают через оператор ** с показателем 1/n:

print(27 ** (1/3))    # кубический корень из 27
print(125 ** (1/3))   # кубический корень из 125

Вывод:

3.0
4.999999999999999

Здесь виден важный подвох. Кубический корень из 27 вышел ровным 3.0, а из 125 — 4.999999999999999 вместо ожидаемых 5.0. Причина не в математике, а в том, что 1/3 не представимо точно в двоичной плавающей точке, и погрешность накапливается. Точный результат тут — 5, но компьютер выдал число чуть меньше.

Если нужен целый корень и вы уверены, что он целый, результат стоит округлить:

print(round(125 ** (1/3)))   # 5
print(round(625 ** (1/4)))   # 5

Вывод:

5
5

Для аккуратного извлечения кубического корня, в том числе из отрицательных чисел, в Python 3.11 появилась функция math.cbrt. Если она доступна в вашей версии, math.cbrt(-8) вернет -2.0, тогда как (-8) ** (1/3) даст комплексное число (об этом ниже). Версию проверьте под свой интерпретатор.

Отрицательные числа и cmath

Из отрицательного числа квадратного корня в области действительных чисел нет, поэтому math.sqrt на отрицательном аргументе не возвращает результат, а поднимает ошибку ValueError:

import math

try:
    print(math.sqrt(-4))
except ValueError as e:
    print("ValueError:", e)  # math domain error

Вывод:

ValueError: math domain error

Если корень из отрицательного числа действительно нужен (это встречается в физике и инженерных расчетах), берут модуль cmath для работы с комплексными числами. Его функция sqrt спокойно принимает отрицательные значения и возвращает комплексный результат:

import cmath

print(cmath.sqrt(-4))       # 2j
print(cmath.sqrt(-1))       # 1j
print(abs(cmath.sqrt(-4)))  # 2.0

Вывод:

2j
1j
2.0

Здесь 2j — это мнимая единица, умноженная на 2 (то есть корень из -4). Функция abs от комплексного числа дает его модуль. Обратите внимание: cmath.sqrt всегда возвращает комплексный тип, даже для положительного аргумента — cmath.sqrt(4) это (2+0j), а не 2.0. Поэтому для обычных положительных чисел остается math.sqrt, а cmath подключают только когда ждут комплексный результат.

Типичные ошибки

Забытый импорт. Функции sqrt нет во встроенном пространстве имен — без import math вызов упадет с NameError:

try:
    print(sqrt(16))
except NameError as e:
    print("NameError:", e)

Вывод:

NameError: name 'sqrt' is not defined

Исправление — импортировать модуль и вызывать math.sqrt(16) либо написать from math import sqrt.

Ожидание целого от float-способов. И math.sqrt, и ** 0.5 возвращают float: 16 ** 0.5 это 4.0, а не 4. Если по логике программы нужен именно int (индекс, размер), результат приводят явно — int(16 ** 0.5) — или сразу берут math.isqrt для целых.

Погрешность в корне n-й степени. Как показано выше, 125 ** (1/3) дает 4.999999999999999. Не сравнивайте такой результат с целым напрямую через ==: либо округляйте round, либо для квадратного случая используйте math.isqrt.

Отрицательный аргумент у math.sqrt. Приводит к ValueError: math domain error. Для комплексного результата — cmath.sqrt.

FAQ

Чем math.sqrt отличается от оператора ** 0.5? Результат одинаковый (float), но math.sqrt читается яснее и на больших числах обычно точнее, а ** 0.5 не требует импорта и удобен для разовых вычислений.

Как извлечь корень без импорта модулей? Оператором степени: x ** 0.5 для квадратного корня и x ** (1/n) для корня n-й степени. Модуль подключать не нужно.

Почему math.sqrt(16) возвращает 4.0, а не 4? Функция всегда работает с плавающей точкой и возвращает тип float. Если нужен целый результат, приведите его через int() или используйте math.isqrt для целых чисел.

Выводы

  • Квадратный корень чаще всего извлекают функцией math.sqrt (нужен import math); результат всегда float.
  • Оператор x ** 0.5 дает тот же результат без импорта, pow(x, 0.5) — аналогично.
  • Для целого корня из целого числа берут math.isqrt — он не зависит от погрешности float и удобен для проверки точного квадрата.
  • Корень n-й степени считают через x ** (1/n), но из-за погрешности float результат стоит округлять; в Python 3.11+ для кубического корня есть math.cbrt.
  • Из отрицательного числа math.sqrt бросает ValueError; комплексный корень дает cmath.sqrt.

Где применяется на практике

Извлечение корня нужно постоянно: расстояние между точками и длина вектора (теорема Пифагора), стандартное отклонение и среднеквадратичная ошибка в статистике и машинном обучении, нормировка данных, физические и инженерные формулы. Умение выбрать правильный инструмент — math.sqrt, math.isqrt или cmath — экономит время на отладке и уберегает от ошибок точности.

Освойте тему на практике

Освоить работу с числами, модулями и типами данных с нуля и на практике помогает курс Специализация Python-разработчик: на нем разбирают математику в коде, стандартную библиотеку и приоритет операций.

Освойте тему на практике

Посмотреть, как преподаватели объясняют такие темы, и задать свои вопросы можно на открытых вебинарах Otus — они бесплатные и проходят регулярно.

Смежные темы: Квадрат числа в математике и программировании, Случайные числа в Python.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)