如何处理溢出错误:(34,"结果太大")作为初学者?



我是python的一个相对初学者,我看到了一些类似的内容,我理解了一些,但不完全。我是一名数学专业的学生,我试图解决欧拉项目的问题。问题是找到斐波那契数列中包含1000位数字的第一项的索引。我找到了斐波那契数列的一般公式,并用python写了如下。它会抛出一个错误

Traceback (most recent call last):
File "C:UsersbaldiDesktopsoru.py", line 6, in <module>
if int(log10(fib(i)))+1<1000:
File "C:UsersbaldiDesktopsoru.py", line 4, in fib
return (((sqrt(5)+1)/sqrt(20))*((sqrt(5)+ 1)/2)**(n-1)+((sqrt(5)-1)/sqrt(20))*((-sqrt(5)+ 1)/2)**(n-1))
OverflowError: (34, 'Result too large')

然后我想找到之后我的值我的函数没有响应

from math import sqrt, log10
a = sqrt(5)
b= sqrt(20)
def fib(n):
return (((a+1)/b)*((a+ 1)/2)**(n-1)+((a-1)/b)*((-a+1)/2)**(n-1))
for i in range(1,10**4):
if int(log10(fib(i)))+1<1000:
continue
else:
print(i)
break

它说计算机在i=1476之后不能计算。我读过类似的文章,他们说你可以使用十进制库,等等。但作为初学者,我要么不知道如何使用它们,要么不理解学习它们的符号。你能帮帮我吗,不要太复杂好吗?

要使用Python查找斐波那契数列中包含1000位数字的第一项的索引,您可以使用以下方法:

  1. 定义一个函数fibonacci_index,它接受一个数字n和返回斐波那契数列第一个项的索引为
  2. 初始化变量a和b为1,它们是的前两项斐波那契数列
  3. 初始化变量index为2,这是第二个变量的索引
  4. 实现一个while循环,该循环一直持续到a大于等于n。循环内:

计算斐波那契数列的下一项,将a和b相加,然后将结果存储在一个新变量c中。设置a为b, b为c。索引增加1。在while循环完成后返回索引。下面是实现这种方法的代码:

def fibonacci_index(n):
a, b = 1, 1
index = 2
while len(str(a)) < n:
c = a + b
a, b = b, c
index += 1
return index
print(fibonacci_index(1000))  # prints 4782

问题是你的数字太大了,python无法处理。所以你要做的是

from decimal import Decimal

然后将ab化为小数:

a = Decimal(sqrt(5))
b = Decimal(sqrt(20))

现在我们还需要确保索引i是Decimal。但是,如果我们只更改它,我们将在尝试使用math.log10时遇到错误。相反,我们使用十进制包中包含的日志函数:

for i in range(1,10**4):
if int(fib(Decimal(i)).log10())+1<1000:
continue
else:
print(i)
break