Python中Long和Float的操作

时间:2009-10-06 14:57:50

标签: python floating-point scipy long-integer

我正在尝试计算:

from scipy import *
3600**3400 * (exp(-3600)) / factorial(3400)

错误:不支持long和float

5 个答案:

答案 0 :(得分:3)

尝试使用对数而不是直接使用数字。由于你的操作都不是加法或减法,你可以用对数形式完成整个事情并在最后转换回来。

答案 1 :(得分:2)

使用如此大小的数字进行计算,你就不能使用普通的64位左右浮点数,这是Python的核心运行时支持的。考虑gmpy获取sourceforge版本,它已经过时了) - 使用math,并注意......:

>>> e = gmpy.mpf(math.exp(1))
>>> gmpy.mpz(3600)**3400 * (e**(-3600)) / gmpy.fac(3400)
mpf('2.37929475533825366213e-5')

(当然,我对gmpy抱有偏见,因为我起源并仍然参与该项目,但我从未对其浮点能力做出强烈主张。我一直在使用它主要用于整数...但是,确实使这个计算成为可能! - 。)。

答案 2 :(得分:1)

您可以尝试使用Decimal对象。计算速度会慢一些,但是你的数字真的很小。

from decimal import Decimal

然而,我不知道Decimal如何与scipy模块交互。

numpy discussion可能相关。

答案 3 :(得分:0)

错误正在发生,因为你试图成倍增加

3600**3400

这是一个很长的

exp(-3600)

这是一个浮动。

但无论如何,你收到的错误是掩盖了真正的问题。似乎exp(-3600)太大了,无论如何都不适合浮动。 python数学库充其量是大数字,充其量。

答案 4 :(得分:0)

exp(-3600)太小,因子(3400)太大:

In [1]: from scipy import exp

In [2]: exp(-3600)
Out[2]: 0.0
In [3]: from scipy import factorial

In [4]: factorial(3400)
Out[4]: array(1.#INF)

如何逐步计算它作为一种解决方法(这是有道理的  检查最小和最大的中间结果):

from math import exp
output = 1
smallest = 1e100
biggest = 0
for i,j in izip(xrange(1, 1701), xrange(3400, 1699, -1)):
    output = output * 3600 * exp(-3600/3400) / i
    output = output * 3600 * exp(-3600/3400) / j
    smallest = min(smallest, output)
    biggest = max(biggest, output)
print "output: ", output
print "smallest: ", smallest
print "biggest: ", biggest

输出是:

output:  2.37929475534e-005
smallest:  2.37929475534e-005
biggest:  1.28724174494e+214