Эта петля не может закончиться в течение вашей жизни.10 ** 100
действительно огромное число.Это больше, чем количество частиц во вселенной, это больше, чем количество самых маленьких периодов времени, которые прошли с момента создания вселенной.На невероятно быстром компьютере - 3 * 10 ** 46
тысячелетия до завершения цикла.Чтобы вычислить бесконечную сумму, которую вы хотите вычислить, пока сумма не перестанет значительно изменяться (например, слагаемые упали ниже определенного очень маленького порога).
Кроме того, xrange
и range
в Python 2 являютсяограничено длинными целыми числами платформы, что означает, что вы не можете иметь числа больше 2 ** 31 на 32-битной машине и 2 ** 63 на 64-битной (последняя по-прежнему слишком велика, чтобы ее завершить в вашейвремя жизни), вот почему вы получаете OverflowError
в Python 2. В Python 3 вы не получите никакой ошибки, но суммирование будет продолжаться вечно.
И вычисление факториала для такого большого числа еще медленнееТаким образом, у вас нет шансов когда-либо превысить максимум даже на 32-битной машине.
Найдите функцию для вычисления бесконечных сумм или сделайте это самостоятельно
>>> from __future__ import division
>>> import itertools
>>> from math import factorial, cos, e
>>> for t in [0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1]:
... summables = ((4 ** (2 * n) * cos(2 * n * t)) / (e ** 16 * factorial(n))
... for n in itertools.count())
... print 0.5 * (1 + sum(itertools.takewhile(lambda x: abs(x) > 1e-80, summables)))
...
1.0
0.973104754771
0.89599816753
0.77928588758
0.65382602277
0.569532373683
0.529115621076
0.512624956755
0.505673516974
0.502777962546
0.501396442319
ТакжеЯ не распознаю формулу, но это должно быть (e ** 16) * factorial(n)
или e ** (16 * factorial(n))
?Я просто хочу отметить, что вы написали первое из-за другого ответа.