← Назад к вопросам
Что произойдет, если взять квадратный корень из отрицательного числа в Python?
1.7 Middle🔥 201 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Квадратный корень из отрицательного числа в Python
Это зависит от того, какой метод ты используешь для вычисления корня. Результат может быть различным.
1. math.sqrt() — ValueError
Модуль math работает только с вещественными числами. Попытка взять корень из отрицательного числа вызывает исключение:
import math
# Корень из положительного числа
print(math.sqrt(9)) # 3.0
# Корень из отрицательного — ошибка!
try:
print(math.sqrt(-4))
except ValueError as e:
print(f"Ошибка: {e}") # Ошибка: math domain error
Это логично — в вещественных числах квадратный корень из отрицательного не существует.
2. cmath.sqrt() — комплексное число
Модуль cmath работает с комплексными числами и может вернуть результат:
import cmath
# Квадратный корень из отрицательного
result = cmath.sqrt(-4)
print(result) # 2j (чисто мнимое число)
print(type(result)) # <class complex>
# Проверка: (2j)² = -4
print(result * result) # (-4+0j)
# Более сложный пример
result2 = cmath.sqrt(-9)
print(result2) # 3j
result3 = cmath.sqrt(-1)
print(result3) # 1j (мнимая единица)
3. Возведение в степень ** — также комплексное число
Оператор ** ведёт себя иначе, чем math.sqrt():
# Вещественное число в степени дроби
print((-4) ** 0.5) # TypeError! Нельзя возвести отрицательное в степень < 1
# Но с комплексными числами работает
result = (-4+0j) ** 0.5
print(result) # (1.2246467991473532e-16+2j) ≈ 2j
4. NumPy — зависит от типа данных
NumPy поведение зависит от типа массива:
import numpy as np
import warnings
# Целые и вещественные типы — warning и nan
with warnings.catch_warnings():
warnings.simplefilter("ignore")
result = np.sqrt(-4)
print(result) # nan (с warning)
# С комплексными типами — комплексный результат
result = np.sqrt(-4+0j)
print(result) # 2j
print(type(result)) # <class numpy.complex128>
Сравнение подходов
import math
import cmath
import numpy as np
value = -4
print("math.sqrt(): ValueError")
print("cmath.sqrt():", cmath.sqrt(value)) # 2j
print("NumPy:", np.sqrt(value)) # nan (warning)
print("-4 ** 0.5: TypeError")
Практические примеры
Решение квадратного уравнения (может быть дискриминант < 0):
import cmath
def solve_quadratic(a, b, c):
"""Решить ax² + bx + c = 0"""
discriminant = b**2 - 4*a*c
# Используем cmath для работы с отрицательным дискриминантом
sqrt_d = cmath.sqrt(discriminant)
x1 = (-b + sqrt_d) / (2*a)
x2 = (-b - sqrt_d) / (2*a)
return x1, x2
# Дискриминант < 0 → комплексные корни
x1, x2 = solve_quadratic(1, 0, 1) # x² + 1 = 0
print(f"x1 = {x1}, x2 = {x2}") # x1 = 1j, x2 = -1j
Обработка ошибок при использовании math:
import math
def safe_sqrt(value):
"""Безопасное вычисление корня"""
if value < 0:
print(f"Предупреждение: корень из отрицательного ({value})")
return None
return math.sqrt(value)
print(safe_sqrt(9)) # 3.0
print(safe_sqrt(-4)) # None (с предупреждением)
Резюме
- math.sqrt() — возбуждает ValueError для отрицательных чисел
- cmath.sqrt() — возвращает комплексное число (например, √(-4) = 2j)
- NumPy — возвращает nan с предупреждением для вещественных массивов
- **Оператор 0.5 — вызывает TypeError для вещественных отрицательных, но работает с комплексными
Выбор метода зависит от контекста: нужны ли комплексные числа или нужно обработать ошибку?