9

I am currently working with very small numbers in my python program, e.g.

x = 200 + 2e-26 

One solution is to work with logarithmic values which would increase the range of my float value. The problem is that I have to do a fft with these values, too, and therefore using the logarithmic approach is not usable (and using the Decimal-module neither). Is there another way to solve that problem?

Edit: My problem with the decimal module is: How can I handle imaginary values? I tried a = Decimal(1e-26)+Decimal(1e-26*1j) and a = Decimal(1e-26)+Decimal(1e-26)*1j, and both ways failed (error on request).

6
  • 3
    What's wrong with the decimal module? Commented Apr 7, 2015 at 9:32
  • I can not use it for complex numbers, I tried with a=Decimal(1e-26)+Decimal(1e-26*1j) and a=Decimal(1e-26)+Decimal(1e-26)*1j. Is there another way? Commented Apr 7, 2015 at 9:36
  • Isn't the problem more like that you have very small numbers added on top of larger numbers and the small number simply drops of at the end of precision? Can you normalize the large number away? Commented Apr 7, 2015 at 9:51
  • The decimal module doesn't support complex numbers, from what I can tell. You might be able to mash the complex and Decimal types together in some class, but I'm not sure if that's the best approach... Commented Apr 7, 2015 at 9:53
  • Are the numbers all biased? So is the "large" component all the time the same? Commented Apr 7, 2015 at 9:56

2 Answers 2

3

Consider trying out the mpmath package.

>>> from mpmath import mpf, mpc, mp >>> mp.dps = 40 >>> mpf(200) + mpf(2e-26) + mpc(1j) mpc(real='200.0000000000000000000000000200000000000007', imag='1.0') 

Mostly accurate and can handle complex numbers, more details in the documentation.

Sign up to request clarification or add additional context in comments.

1 Comment

Unfortunately I can not see how to do a FT here, when trying the numpy-fft, I get an error.
2

While numpy supports more decimal types (and also complex versions), they don't help:

>>> import numpy >>> numpy.longfloat <type 'numpy.float128'> >>> a = numpy.array([200, 2e-26], dtype=numpy.longfloat) >>> a array([ 200.0, 2e-26], dtype=float128) >>> a.sum() 200.0 >>> a = numpy.array([200, 2e-26], dtype=numpy.longdouble) >>> a.sum() 200.0 

The reason is explained here: Internally, numpy uses 80 bits which means 63 bits mantissa which just supports 63/3 = 21 digits.

What you need is a real 128bit float type like the one from boost.

Try the Boost.Python module which might give you access to this type. If that doesn't work, then you'll have to write your own wrapper class in C++ as explained here.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.