← Все вопросы

квадратное уравнение через дискриминант на питоне выдаёт ошибку с корнем

Задан 6 месяцев назад218 просмотров2 ответа
7

Решаю квадратное уравнение через дискриминант, но программа падает с ошибкой math domain error, когда корней нет. Вот код:

import math
a, b, c = 1, 2, 5
d = b**2 - 4*a*c
x1 = (-b + math.sqrt(d)) / (2*a)
x2 = (-b - math.sqrt(d)) / (2*a)
print(x1, x2)

Для уравнения x^2+2x+5 он ломается. Как сделать чтоб не падал, а писал что корней нет?

2 ответа

12
✓ Принятый ответ — помог автору

Всё логично: дискриминант у тебя получился отрицательный, а из отрицательного числа math.sqrt корень брать не умеет — отсюда math domain error. Надо ДО взятия корня проверить знак дискриминанта:

import math

a, b, c = 1, 2, 5
d = b**2 - 4*a*c

if d > 0:
    x1 = (-b + math.sqrt(d)) / (2*a)
    x2 = (-b - math.sqrt(d)) / (2*a)
    print("Два корня:", x1, x2)
elif d == 0:
    x = -b / (2*a)
    print("Один корень:", x)
else:
    print("Действительных корней нет")

Как это работает простыми словами. Дискриминант D = b² − 4ac — это «индикатор», который заранее говорит сколько будет корней:

  • D > 0 → два разных корня
  • D = 0 → один корень (точнее два одинаковых)
  • D < 0 → корней нет (в школьном смысле, без комплексных)

Сами корни считаются по формуле (-b ± √D) / (2a). Знак ± — это и есть твои x1 и x2. Главное правило: брать корень sqrt(D) можно только когда убедился, что D >= 0, поэтому проверка через if обязательна.

3

Не забудь ещё про случай a == 0 — тогда это уже не квадратное уравнение, а линейное, и 2*a в знаменателе даст деление на ноль:

if a == 0:
    print("Это не квадратное уравнение")

На контрольной обычно a != 0, но если данные вводит пользователь — лучше подстраховаться.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект