Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OverflowError: (34, 'Result too large')

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())
like image 813
user3033766 Avatar asked Nov 25 '13 19:11

user3033766


People also ask

How do you fix an overflow error in Python?

These errors can be handled by using exception handling. In the below section we will see about this exception handling. In the above programs, we saw the Overflow error that occurred when the current value exceeds the limit value. So to handle this we have to raise overflowError exception.

How do you avoid overflow errors in Python?

You can combine both of your functions to make just one function, and using list comprehension, you can make that function run in one line. You cannot prevent overflow errors if you are working with very large numbers, instead, try catching them and then breaking: import math def fib(j): try: for i in [int(((1+math.


5 Answers

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 decimal
decimal.getcontext().prec = 100
def pi():
    pi = decimal.Decimal(0)
    for k in range(350):
        pi += (decimal.Decimal(4)/(decimal.Decimal(8)*decimal.Decimal(k+1))...)
like image 173
Peter DeGlopper Avatar answered Oct 13 '22 16:10

Peter DeGlopper


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.**k
Traceback (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.**k
3.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, localcontext

def 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 
like image 41
Martijn Pieters Avatar answered Oct 13 '22 17:10

Martijn Pieters


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.

like image 27
Bence Avatar answered Oct 13 '22 18:10

Bence


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)

like image 38
员建新 Avatar answered Oct 13 '22 18:10

员建新


This is a python solution to this problem using the decimal library. This code counts one thousand digits of pi.

import decimal
def pi( prec = 10 ** 3 ):
    decimal.getcontext().prec = prec
    b =  decimal.Decimal(1)
    pi = 0
    for k in range(prec):
        pi += ( b*4/(8*k+1) - b*2/(8*k+4) - b*1/(8*k+5) - b*1/(8*k+6)) / 16**k
    return pi
print(pi())

This is a solution using only the built-in any size integers. It works much more efficiently and allows you to count ten thousand digits of pi.

def pi( prec = 10 ** 4 ):
    b = 10 ** prec
    pi = 0
    for k in range(prec):
        pi += ( b*4//(8*k+1) - b*2//(8*k+4) - b*1//(8*k+5) - b*1//(8*k+6)) // 16**k
    return pi
print(pi())

By starting this code, you can brag to your friends that you have counted ten thousand as pi :).

like image 35
Vadim Romanko Avatar answered Oct 13 '22 16:10

Vadim Romanko