I'm trying to continue on my previous question in which I'm trying to calculate Fibonacci numbers using Benet's algorithm. To work with arbitrary precision I found
from mpmath import *
return (1 + sqrt(5)) / 2
return (1 - sqrt(5)) / 2
return (power(Phi(), n) - power(phi(), n)) / sqrt(5)
start = 99
end = 100
for x in range(start, end):
mpmath provides arbitrary precision (as set in
mpmath.mp.dps), but still inaccuate calculation. For example,
mpmath.sqrt(5) is not accurate, so any calculation based on that will also be inaccurate.
To get an accurate result for
sqrt(5), you have to use a library which supports abstract calculation, e.g. http://sympy.org/ .
To get an accurate result for Fibonacci numbers, probably the simplest way is using an algorithm which does only integer arithmetics. For example:
def fib(n): if n < 0: raise ValueError def fib_rec(n): if n == 0: return 0, 1 else: a, b = fib_rec(n >> 1) c = a * ((b << 1) - a) d = b * b + a * a if n & 1: return d, c + d else: return c, d return fib_rec(n)