← Назад к вопросам

Что произойдет, если взять квадратный корень из отрицательного числа в 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 для вещественных отрицательных, но работает с комплексными

Выбор метода зависит от контекста: нужны ли комплексные числа или нужно обработать ошибку?