Как исправить переполнение: ошибка математического диапазона

Всякий раз, когда я ввожу этот код, я получаю OverflowError: math range error в 4-й строке. Как это исправить?

x=0
while True:
    x=int(x)+1
    first_root=first_root-((a*(math.pow(first_root, 3)))+(b*(math.pow(first_root, 2))+(c*first_root)+d)/(3*(a*   (math.pow(first_root, 2))))+(2*(b*first_root))+c)
    if x==30:
        break

person user2442129    schedule 01.06.2013    source источник
comment
Чем инициализируется first_root?   -  person Waleed Khan    schedule 01.06.2013
comment
во-первых, разделите эту строку как минимум на 4 разные строки.   -  person Elazar    schedule 01.06.2013
comment
И чем инициализируются a и b?   -  person 比尔盖子    schedule 01.06.2013


Ответы (1)


Простой ответ заключается в том, что используемое вами уравнение не имеет корня. вы можете увидеть это, используя оператор print first_root внутри цикла while и увидев, что он расходится на +-inf.

Однако, если предположить, что ваш учебник вас не обманывает, и уравнение действительно имеет корень, я могу почти гарантировать, что вы поставили круглую скобку не в том месте. Ниже приведен ваш точный код со всеми удаленными ненужными круглыми скобками и заменой first_root на r, чтобы его было легче читать.

r = r - a*pow(r, 3) + b*(pow(r, 2) + c*r + d) / 3*a*pow(r, 2) + 2*b*r + c

Что вам нужно сделать, так это сравнить это с уравнением в вашей книге и посмотреть, где/если вы его напутали.

person bcorso    schedule 02.06.2013
comment
Кстати, я предполагаю, что первое b следует умножать только на r ^ 2, а не на другие члены. - person bcorso; 02.06.2013