By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
 428,829 Members | 1,798 Online + Ask a Question
Need help? Post your question and get tips & solutions from a community of 428,829 IT Pros & Developers. It's quick & easy.

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

 P: n/a 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 expx=1000.z=exp(x) so that z returns an actual value Thanks in advance for any advice! Todd Sep 14 '05 #1
Share this Question
5 Replies

 P: n/a "Todd Steury" writes: 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 expx=1000.z=exp(x) 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) Sep 14 '05 #2

 P: n/a Todd Steury wrote: 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 Sep 14 '05 #3

 P: n/a > "Todd Steury" writes: 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? This is really a natural problem with such calculations. On Wednesday 14 September 2005 02:30 pm, Paul Rubin wrote: 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. -- Terry Hancock ( hancock at anansispaceworks.com ) Anansi Spaceworks http://www.anansispaceworks.com Sep 14 '05 #4

 P: n/a 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 Sep 15 '05 #5

 P: n/a Mikael Olofsson writes: 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? Yeah, doh. c=characteristic, m=mantissa. Sep 15 '05 #6

### This discussion thread is closed

Replies have been disabled for this discussion. 