Как исправить ошибку OverflowError: int too large to convert to float

Есть задание в котором следует исследовать ряд на сходимость введите сюда описание изображения

Условие окончания цикла вычисления суммы принять в виде: | un | <E або | un | > G где Е - малая величина для прерывания цикла вычисления суммы схождения ряда (е = 10-5 ... 10-20); G - величина для прерывания цикла вычисления суммы расхождения ряда (g = 102 ... 105).

и у меня есть некий скрипт:

def task_series12():
    """check the series (variant 12) for convergence"""
    n = 1
    s = u = 2
    e = 1e-10  # g = 1e+5
    while abs(u) > e:  # abs(u)>g
        print(u)
        n += 1
        if n ** math.sqrt(n) == 0:
            break
        u = (math.factorial(n) * math.exp(n)) / (n ** math.sqrt(n))
        s += u
    else:
        print("Series converge to: ", s)  # "Maximum sum is:"
        return True
    print("Division by zero!")
    return False

но как итог выбивает ошибку OverflowError: int too large to convert to float

Как это исправить?


Ответы (2 шт):

Автор решения: Stanislav Volodarskiy

Вызов math.factorial(n), n > 170 порождает числа которые не могут быть переведены во float.

Чтобы это исправить, выразите член ряда a(n + 1) через a(n). Вычисляйте их в цикле друг через друга. Так вы продвинетесь дальше.

Но далеко вы не уйдёте. Чтобы понять почему, печатайте значения a(n) и вспоминайте условие сходимости ряда.

→ Ссылка
Автор решения: CrazyElf

Зря вы игнорировали часть задания "G - величина для прерывания цикла вычисления суммы расхождения ряда". Вам надо проверять и эту часть. Ряд может как сходиться, так и расходиться.

Если вам нужно в цикле проверять несколько условий выхода, то лучше это делать так:

e = 1e-10
g = 1e+5
while True:
    if abs(u) < e:
        print('Ряд сошёлся')
        break
    if abs(u) > g:
        print('Ряд разошёлся')
        break
    # остальное тело цикла
→ Ссылка