我尝试在Python3中实现Binet的计算第n个Fibonacci数的公式
def nth_fib(n):
# this function returns fibonacci number of
# the given term by using Binet's Formula
sq5 = 5 ** 0.5
phi = (sq5 + 1) / 2
fib = (phi ** n) - (-phi ** -n)
fib //= sq5
return int(fib)
此实施的问题:
它能处理的最大值是1474。传递大于1474的值会引发以下异常
OverflowError: (34, 'Numerical result out of range')
如何改进此解决方案以处理从0到10^14的输入?
参考:
之所以会发生这种情况,是因为任意大的求幂运算只适用于整数,而整数在Python中是bignum。浮点数将失败。例如:
解决方案是使用Decimal类,它可以处理任意精度浮点运算,包括求幂:
考虑到这一点,重写的
nth_fib
函数可能如下所示(我合并了一些数学运算并删除了整数除法以避免类型错误):这将产生如下输出:
如评论中所述,浮点数上的任何操作都会累积错误,其规模取决于所执行的操作及其频率
我希望这有帮助。干杯
相关问题 更多 >
编程相关推荐