在python中处理非常小的数字

时间:2015-04-07 09:27:04

标签: python

我目前正在使用我的python程序中的非常小的数字,例如

x = 200 + 2e-26

一种解决方案是使用对数值,这将增加我的浮点值的范围。问题是我必须使用这些值进行fft,因此使用对数方法是不可用的(并且不使用Decimal - 模块)。有没有其他方法可以解决这个问题?

编辑:我对decimal模块的问题是:我如何处理虚数值?我尝试了a = Decimal(1e-26)+Decimal(1e-26*1j)a = Decimal(1e-26)+Decimal(1e-26)*1j,两种方式都失败了(请求时出错)。

2 个答案:

答案 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编写自己的包装类。