How to manage division of huge numbers in Python?

53,638

Solution 1

In Python 3, number / 10 will try to return a float. However, floating point values can't be of arbitrarily large size in Python and if number is large an OverflowError will be raised.

You can find the maximum that Python floating point values can take on your system using the sys module:

>>> import sys
>>> sys.float_info.max
1.7976931348623157e+308

To get around this limitation, instead use // to get an integer back from the division of the two integers:

number // 10

This will return the int floor value of number / 10 (it does not produce a float). Unlike floats, int values can be as large as you need them to be in Python 3 (within memory limits).

You can now divide the large numbers. For instance, in Python 3:

>>> 2**3000 / 10
OverflowError: integer division result too large for a float

>>> 2**3000 // 10
123023192216111717693155881327...

Solution 2

If you have an integer and you want each digit in a list, you can use:

>>> map(int,list(str(number)))
[1, 5, 0, 3, 0, 0, 7, 6, 4, 2, 2, 6, 8, 3, 9, 7, 5, 0, 3, 6, 6, 4, 0, 5, 1, 2, 4, 3, 7, 8, 2, 5, 2, 4, 4, 5, 4, 8, 4, 0, 6, 6, 4, 5, 0, 9, 2, 4, 8, 9, 2, 9, 7, 8, 7, 3, 9, 9, 9, 7, 0, 1, 7, 4, 8, 2, 4, 4, 2, 9, 6, 9, 5, 1, 7, 1, 3, 4, 8, 5, 1, 3, 3, 1, 7, 9, 0, 1, 0, 1, 9, 3, 8, 4, 2, 0, 1, 9, 2, 9]

it transform the int into a string, then list will take each character of the string and put it in a list. Finally, map will convert each item of the list into an int again

Solution 3

Python will automatically handle large ints of arbitrary length. What it won't do is handle floats of arbitrary length so you need to make sure you're not getting floats along the way.

Share:
53,638

Related videos on Youtube

Ambidextrous
Author by

Ambidextrous

Updated on July 05, 2022

Comments

  • Ambidextrous
    Ambidextrous almost 2 years

    I have a 100 digit number and I am trying to put all the digits of the number into a list, so that I can perform operations on them. To do this, I am using the following code:

    for x in range (0, 1000):
       list[x] = number % 10
       number = number / 10
    

    But the problem I am facing is that I am getting an overflow error something like too large number float/integer. I even tried using following alternative

    number = int (number / 10)
    

    How can I divide this huge number with the result back in integer type, that is no floats?

  • Ambidextrous
    Ambidextrous over 9 years
    The number is already integer and it works. Problem happens in case of division. When I try to divide it by 10, i just want remaining integer. If i use int(number/10) i get error number too big for float.
  • Ambidextrous
    Ambidextrous over 9 years
    true. But, how can I avoid that in case I am dividing the number. Is there any function to handle this.
  • erip
    erip over 9 years
    That's interesting because x mod 10 should be in the subset [0, 9]; thus, division by 10 would be 0 by integer division.
  • Ambidextrous
    Ambidextrous over 9 years
    But does this works on long int also? I suppose in case of a large number, python will automatically choose it as long it?
  • erip
    erip over 9 years
    Oh wait, python's / isn't integer division. // is the way to go.
  • Alex Riley
    Alex Riley over 9 years
    In Python 3 there is no long type (integers can be any size). It works in Python 2 with both types.
  • ZekeDroid
    ZekeDroid over 9 years
    yeah as previously mentioned, using the // operator will help you ensure your answer is always an int.
  • Mudit Jain
    Mudit Jain almost 8 years
    Awesome. Didn't know about // division before.
  • Maxpm
    Maxpm almost 5 years
    Careful. Just because you don't get an OverflowError doesn't mean the division is correct. stackoverflow.com/questions/26740938/…
  • Alex Riley
    Alex Riley almost 5 years
    @Maxpm: that's true for true division (/) where you get back a float, but for integer a and b you can be sure that the integer division a // b is correct, regardless of the magnitude of the resulting integer.