OverflowError: int too large to convert to float
def tailor(x):
s = 0
l = 3 * x
for n in range(1, 1025):
term = ((-1)**(n-1))*((1+2**n)*x**n)/n
if abs(term) < 0.000001:
break
if abs(term) > l:
exit(2)
s += term
return s
x = 0.5
print(tailor(x), math.log(1+3*x+2*x**2))
Код вычисляет значение функции ln(1+3x+2x^2) путем сложения членов заданного ее ряда S с точностью 10^(-6). Выдает ошибку OverflowError: int too large to convert to float, полагаю связанно с ограничениями типов, можно ли как то решить проблему?
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
Вы пытаетесь вычислить член ряда напрямую деля гигантские числа. Вместо этого следующий член может быть вычислен из предыдущего. При этом больших значений не возникает. Дополнительно я убрал ограничение на число итераций и вывел это число на печать:
def tailor(x):
t1 = -1
t2 = -1
s = 0
n = 1
while True:
t1 *= -x
t2 *= -2 * x
term = (t1 + t2) / n
if abs(term) < 0.000001:
return s, n
assert abs(term) <= 3 * x, f'limit! {term} > 3 * {x}'
s += term
n += 1
for i in range(11):
x = i / 20
y, n = tailor(x)
y2 = math.log(1 + 3 * x + 2 * x ** 2)
print(f'{x:.2f}', f'{y:.10f}', f'{y2:.10f}', n)
$ python tailor.py 0.00 0.0000000000 0.0000000000 1 0.05 0.1441005000 0.1441003440 6 0.10 0.2776320095 0.2776317366 8 0.15 0.4021266715 0.4021262068 10 0.20 0.5187934168 0.5187937934 13 0.25 0.6286093082 0.6286086594 16 0.30 0.7323682739 0.7323678937 22 0.35 0.8307332915 0.8307328435 30 0.40 0.9242583585 0.9242589015 45 0.45 1.0134169394 1.0134174426 89 0.50 1.0986117887 1.0986122887 1000001
P.S. Ряд знакопеременный. Его вычисление можно ускорить. Но это совсем другая история.
