OverflowError: (34, 'Result too large') OverflowError: (34, 'Result too large') python python

OverflowError: (34, 'Result too large')


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, the decimal library allows arbitrary precision and can handle the size:

import decimaldecimal.getcontext().prec = 100def pi():    pi = decimal.Decimal(0)    for k in range(350):        pi += (decimal.Decimal(4)/(decimal.Decimal(8)*decimal.Decimal(k+1))...)


You reached the limits of your platform's float support, probably after k = 256:

>>> k = 256>>> (4./(8.*k+1.) - 2./(8.*k+4.) - 1./(8.*k+5.) - 1./(8.*k+6.)) / 16.**kTraceback (most recent call last):  File "<stdin>", line 1, in <module>OverflowError: (34, 'Result too large')>>> k = 255>>> (4./(8.*k+1.) - 2./(8.*k+4.) - 1./(8.*k+5.) - 1./(8.*k+6.)) / 16.**k3.19870064997e-313

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.

from decimal import Decimal, localcontextdef pi():     with localcontext() as ctx:        ctx.prec = 100  # 100 digits precision        pi = Decimal(0)         for k in range(350):             pi += (Decimal(4)/(Decimal(8)*k+1) - Decimal(2)/(Decimal(8)*k+4) - Decimal(1)/(Decimal(8)*k+5) - Decimal(1)/(Decimal(8)*k+6)) / Decimal(16)**k     return pi 


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.