Overflow error

J

Jane Austine

from math import e
Traceback (most recent call last):
File "<pyshell#15>", line 1, in -toplevel-
e**710
OverflowError: (34, 'Result too large')

What should I do to calculate e**710?

I'm using Python 2.3.4 on WinXP.
 
M

Michael Hudson

Traceback (most recent call last):
File "<pyshell#15>", line 1, in -toplevel-
e**710
OverflowError: (34, 'Result too large')

What should I do to calculate e**710?

Well, it's too big for your platform's C double, so you need a
different representation. I don't know if there are big float
packages out there that handle such things (likely, though) or if
there are Python interfaces to the same (less likely). Or you could
store the logarithms of the numbers you are interested in. Why do you
need such huge nubmers?

Cheers,
mwh
 
S

Scott David Daniels

Michael said:
Well, it's too big for your platform's C double, so you need a
different representation. I don't know if there are big float
packages out there that handle such things (likely, though) or if
there are Python interfaces to the same (less likely). Or you could
store the logarithms of the numbers you are interested in. Why do you
need such huge nubmers?

Cheers,
mwh
Using a little bit of magic:

First get a good approximation of e:
Using my bits package, I can do:

import bits, math
scaling = bits.lsb(math.e)
characteristic = bits.extract(math.e, scaling, 10)
# This has the same effect as:
# scaling, characteristic = -51, 6121026514868073L
# Now e = characteristic * 2.**scaling
result_scaling = scaling * 710
result_characteristic = characteristic ** 710
intpart = result_characteristic >> -result_scaling
# and you'll have to grab as much fractpart as you want.

Similarly, for decimal, type in enough digits (for your taste) of e
from some reference book, and omit the decimal point.
Then track the exponent in base ten, and you can obtain similar results:

scaling, characteristic = -5, 271828
result_scaling = scaling * 710
result_characteristic = characteristic ** 710
intpart = result_characteristic // 10 ** -result_scaling


So, you needn't use floating point if you are willing to type in
constants. Both of these give a number which is 223. * 10 ** 50 to
three digits, and they differ in the fourth digit (4 or 3 if you round).
The binary-based version (the first above) produces:
2233994766....
While the decimal-based version produces:
2232928102....
This is certainly due to using so few decimal places for e in the
decimal version.
In Knuth's Art of Computer Programming (at least volume 3, which I
happen to have at hand) Appendix A, you can get 41 decimal digits for e,
or 45 octal digits if you prefer to work with binary. I believe
(without checking) that each of the volumes contains this appendix.
The big advantage of using decimal is (a) more readily available tables
of constants come in decimal than in binary, and (b) if you _do_ want
to print some of the fractpart, it is easier just to change the division
to include the extra digits, while for the binary versions you'll have
to multiply by 10**digits before the division.
 
P

Paul Rubin

Traceback (most recent call last):
File "<pyshell#15>", line 1, in -toplevel-
e**710
OverflowError: (34, 'Result too large')

What should I do to calculate e**710?

Is this a homework problem?

Aw heck, you can do something like this:

from math import *
a,b = divmod(710 * log10(e), 1.0) # int and frac parts of log10(e**710)
print '%f * 10**%d'%(10.** b, a)

This prints: 2.233995 * 10**308
 
D

Dan Bishop

Michael Hudson said:
Well, it's too big for your platform's C double, so you need a
different representation. I don't know if there are big float
packages out there that handle such things (likely, though) or if
there are Python interfaces to the same (less likely).

You can also do it with rationals:
.... n = start
.... while True:
.... yield n
.... n += 1
........ total = term = 1
.... for n in unboundedRange(1):
.... term *= rational(x, n)
.... total += term
.... if abs(term) < tolerance:
.... break
.... return total
....223399476616171103125364445811681000656812286337946419939922579763369439173505508238045208936075928608008858947959672204126540307964255760331629484074081710600724815623037686564199430826371986947985157927836355814874856465984698389900107606439843841800268119591413945009951691796042715693932113514608158683164L

However, I don't recommend this, because it's *very* slow.
 
J

Jane Austine

You can also do it with rationals:

... n = start
... while True:
... yield n
... n += 1
...
... total = term = 1
... for n in unboundedRange(1):
... term *= rational(x, n)
... total += term
... if abs(term) < tolerance:
... break
... return total
...
223399476616171103125364445811681000656812286337946419939922579763369439173505508238045208936075928608008858947959672204126540307964255760331629484074081710600724815623037686564199430826371986947985157927836355814874856465984698389900107606439843841800268119591413945009951691796042715693932113514608158683164L

However, I don't recommend this, because it's *very* slow.

Interesting. Where do I get the "rational" module?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top