在Python中处理非常小的数字

9

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

x = 200 + 2e-26

一种解决方案是使用对数值,这会增加我的浮点值的范围。但问题是我也需要对这些值进行fft,因此使用对数方法不可行(使用Decimal模块也不行)。有没有其他方法来解决这个问题?
编辑:我在使用decimal模块时遇到的问题是:如何处理虚数值?我尝试了a = Decimal(1e-26)+Decimal(1e-26*1j)a = Decimal(1e-26)+Decimal(1e-26)*1j,但两种方式都失败了(请求错误)。

3
decimal模块有什么问题? - Aaron Digulla
我无法在复数中使用它,我尝试了 a=Decimal(1e-26)+Decimal(1e-26*1j)a=Decimal(1e-26)+Decimal(1e-26)*1j。还有其他的方法吗? - arc_lupus
问题不是你在大数上加了很小的数,而是这个小数在精度末尾被舍弃了。你能把大数规范化吗? - dhke
据我所知,decimal 模块不支持复数。你可能可以将 complexDecimal 类型混合在一些类中,但我不确定这是否是最佳方法... - Martijn Arts
这些数字都有偏差吗?那么“大”的组件始终是相同的吗? - Oliver W.
这些数字存在偏差,但仅限于 n*10**2 的值,因此并没有真正的好处。 - arc_lupus
2个回答

3

考虑尝试使用mpmath

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

这个工具可以准确地处理复杂数字,并且更多细节可以在文档中查看。


很遗憾,我无法在这里执行FT操作,当尝试使用numpy-fft时,我会收到一个错误。 - arc_lupus

2

虽然 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

原因在此解释:在内部,numpy使用80位,即63位尾数,只支持63/3 = 21个数字。
你需要的是一个真正的128位浮点类型(如来自boost的类型)
尝试使用Boost.Python模块,这可能会让你访问到这种类型。如果不起作用,那么你将不得不编写自己的C++包装类,如此处所述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接