0

我正在尝试计算:

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

错误:不支持 long 和 float

4

5 回答 5

3

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

于 2009-10-06T15:44:22.293 回答
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,因为我发起并仍然参与该项目,但我永远不会强烈声称它的浮点能力......我一直将它主要用于整数的东西......仍然,它确实使这种计算成为可能!-)。

于 2009-10-06T17:58:45.833 回答
1

您可以尝试使用Decimal对象。计算会更慢,但你不会遇到非常小的数字的问题。

from decimal import Decimal

但是,我不知道 Decimal 如何与 scipy 模块交互。

这个麻木的讨论可能是相关的。

于 2009-10-06T15:53:16.083 回答
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
于 2009-10-06T23:40:17.497 回答
0

好吧,错误正在发生,因为您正在尝试相乘

3600**3400

这是一个很长的

exp(-3600)

这是一个浮动。

但无论如何,您收到的错误掩盖了真正的问题。似乎 exp(-3600) 是一个太大的数字,无论如何都无法放入浮点数中。python 数学库充其量是变化无常的。

于 2009-10-06T15:31:18.087 回答