квадратное уравнение через дискриминант на питоне выдаёт ошибку с корнем
Решаю квадратное уравнение через дискриминант, но программа падает с ошибкой 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 ответа
Всё логично: дискриминант у тебя получился отрицательный, а из отрицательного числа 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 обязательна.
Не забудь ещё про случай a == 0 — тогда это уже не квадратное уравнение, а линейное, и 2*a в знаменателе даст деление на ноль:
if a == 0:
print("Это не квадратное уравнение")
На контрольной обычно a != 0, но если данные вводит пользователь — лучше подстраховаться.