我目前正在使用我的python程序中的非常小的数字,例如
x = 200 + 2e-26
一种解决方案是使用对数值,这将增加我的浮点值的范围。问题是我必须使用这些值进行fft,因此使用对数方法是不可用的(并且不使用Decimal
- 模块)。有没有其他方法可以解决这个问题?
编辑:我对decimal
模块的问题是:我如何处理虚数值?我尝试了a = Decimal(1e-26)+Decimal(1e-26*1j)
和a = Decimal(1e-26)+Decimal(1e-26)*1j
,两种方式都失败了(请求时出错)。
答案 0 :(得分:2)
考虑尝试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')
最准确,可以在documentation中处理复杂的数字和更多细节。
答案 1 :(得分:1)
虽然numpy
支持更多小数类型(以及复杂版本),但它们无法提供帮助:
>>> 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
原因是explained here:在内部,numpy
使用80位,这意味着63位尾数只支持63/3 = 21位。
您需要的是真正的128位浮点型like the one from boost。
尝试Boost.Python
module,这可能会让您访问此类型。如果这不起作用,那么您必须用C explained here编写自己的包装类。