I'am getting an overflow error(OverflowError: (34, 'Result too large')
I want to calculate pi to 100 decimals here's my code:
def pi():
pi = 0
for k in range(350):
pi += (4./(8.*k+1.) - 2./(8.*k+4.) - 1./(8.*k+5.) - 1./(8.*k+6.)) / 16.**k
return pi
print(pi())
Python floats are neither arbitary precision nor of unlimited size. When k = 349,
16.**k
is much too large - that's almost 2^1400. Fortunately, thedecimal
library allows arbitrary precision and can handle the size:16.**256 is too large to be stored in double precision float. I suggest that you run your cycle for less, like range(250), because larger k values will not contribute to the first hundred digits anyway.
Another thing you might try is to multiply by 16.*(-k) instead of dividing by 16.*k. This number will be rounded to zero for large k, therefore will not give you runtime errors.
I suggest that you use numpy.power instead of **, it handles overflows better. For example, in your code numpy.power(16.,256) would evaluate to inf, and dividing a finite number by inf gives zero, which avoids runtime errors just like the method suggested in the previous paragraph.
I use python3.6 AMD64,I also meet this problem,this is because python built-in
float
is double-precision-float,it's 64 bit,in most progamming task,64 bit is enough,but in some extra task,it's not enough(like scitific computing,big data compute)You reached the limits of your platform's
float
support, probably afterk = 256
:See
sys.float_info
for the exact limitations, but you are unlikely to run into a current CPU and OS combination that'll give you 100 significant digits in any case; my MacBook Pro with 64-bit OS X will only support 15.Use the
decimal
module to go beyond your hardware limitations.