working with VERY large 'float' and 'complex' types

T

Todd Steury

Greetings Python'ers:

I'm just an amature who occasionally uses Python for complex mathematical
models. The current model I'm working with occasionally generates really
large numbers that are either "float" or "complex" types. These numbers are
so large that I either get an overflow error, or some funky code like #INF
or 1.#INDj. However I really need these numbers to be calculated (although
precision isn't key). Is there a way to get python to increase the size
limit of float and complex numbers? I should mention that I'm using a lot of
pre-made modules and functions like math.exp() and scipy.special.erf() that
don't seem to be able to use available types like "Decimal" or "FixedPoint"
(especially since these don't seem to handle complex numbers).

Since I learn best by example, how could one solve the following problem:

from math import exp
so that z returns an actual value

Thanks in advance for any advice!

Todd
 
P

Paul Rubin

Todd Steury said:
or 1.#INDj. However I really need these numbers to be calculated (although
precision isn't key). Is there a way to get python to increase the size
limit of float and complex numbers?

Python just uses machine doubles by default. You might be able to edit
the source so it uses, say, 80-bit extended floats if you're on a machine
that supports them (like the x86). Those do support larger exponents.

You could also use something like gmpy, which supports arbitrary size
and arbitrary precision numbers. Of course it's slow by comparison.
Since I learn best by example, how could one solve the following problem:

from math import exp

so that z returns an actual value

You could rearrange your formulas to not need such big numbers:

x = 1000.
log10_z = x / math.log(10)
c,m = divmod(log10_z, 1.)
print 'z = %.5fE%d' % (10.**c, m)
 
F

Fernando Perez

Todd said:
Greetings Python'ers:

I'm just an amature who occasionally uses Python for complex mathematical
models. The current model I'm working with occasionally generates really
large numbers that are either "float" or "complex" types. These numbers are
so large that I either get an overflow error, or some funky code like #INF
or 1.#INDj. However I really need these numbers to be calculated (although
precision isn't key). Is there a way to get python to increase the size
limit of float and complex numbers? I should mention that I'm using a lot of
pre-made modules and functions like math.exp() and scipy.special.erf() that
don't seem to be able to use available types like "Decimal" or "FixedPoint"
(especially since these don't seem to handle complex numbers).

Python floats are C doubles underneath, so you're stuck. You need extended
numeric types. Decimal is slow as molasses, and was not designed for
mathematical work (rather for finance-type fixed-point work). Use this
instead:

http://calcrpnpy.sourceforge.net/clnumManual.html

Cheers,

f
 
T

Terry Hancock

This is really a natural problem with such calculations.

You could rearrange your formulas to not need such big numbers:

x = 1000.
log10_z = x / math.log(10)
c,m = divmod(log10_z, 1.)
print 'z = %.5fE%d' % (10.**c, m)

I highly recommend you use this kind of solution. Solve the problem
with algebra, not with a new library. Most of the time, large numbers
can be avoided (particularly if you are not overly concerned with
precision), simply by dividing out large constant factors and the
like. Logs work better for this problem, as Paul points out.
 
M

Mikael Olofsson

Paul Rubin calculates exp(1000.0):
You could rearrange your formulas to not need such big numbers:

x = 1000.
log10_z = x / math.log(10)
c,m = divmod(log10_z, 1.)
print 'z = %.5fE%d' % (10.**c, m)

Nice approach. We should never forget that we do have mathematical
skills beside the computers. But, shouldn't you switch c and m in the
last row?

/MiO
 
P

Paul Rubin

Mikael Olofsson said:
Nice approach. We should never forget that we do have mathematical
skills beside the computers. But, shouldn't you switch c and m in the
last row?

Yeah, doh. c=characteristic, m=mantissa.
 

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

Staff online

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top