Корни квадратичной функции: ошибка математической области

Я хочу определить функцию, которая возвращает значения корней. Предполагается всегда что-то вернуть.

Если b ** 2 - 4 a c ‹0, то предполагается, что он вернет [], но это выглядит как ошибка.

Мой код сейчас таков:

    from math import*
    def solve(a, b, c):
        x = sqrt(b**2 - 4*a*c)

        if x > 0:
           x1 = (-b + x)/(2*a)
           x2 = (-b - x)/(2*a)
           return [x1, x2]

        elif x == 0:
           x1 = x2 = -b/(2*a)
           return [x1]

       else:
           return []

person Anonymous    schedule 03.06.2018    source источник


Ответы (2)


sqrt не принимает отрицательные значения. Чтобы избежать этого, вы можете проверить свое условие else перед вычислением квадратного корня:

from math import sqrt

def solve(a, b, c):
    
    formula = b**2 - 4*a*c

    if formula < 0:
       return []

    x = sqrt(formula)

    if x > 0:
       x1 = (-b + x)/(2*a)
       x2 = (-b - x)/(2*a)
       return [x1, x2]

    elif x == 0:
       x1 = x2 = -b/(2*a)
       return [x1]
person iacob    schedule 03.06.2018

math.sqrt не определен для отрицательных чисел и поэтому возвращает ValueError.

Если вы хотите вернуть комплексный квадратный корень для отрицательных значений, используйте x**0.5:

x = (b**2 - 4*a*c)**0.5

В качестве альтернативы используйте реализацию cmath.sqrt:

from cmath import sqrt

x = sqrt(b**2 - 4*a*c)
person Nick Ven    schedule 03.06.2018
comment
Я понял, проблема в том, что «› »не поддерживается между экземплярами« complex »и« int », поэтому это означает, что мне придется изменить весь код, не так ли? В любом случае, мне не нужен сложный корень, мне нужен только [] как return, когда b ** 2 - 4 * a * c ‹0, но совет появляется всегда. - person Anonymous; 04.06.2018
comment
ну да ... вам нужно изменить свой код - person Nick Ven; 04.06.2018