我正在尝试计算:
from scipy import *
3600**3400 * (exp(-3600)) / factorial(3400)
错误:不支持 long 和 float
我正在尝试计算:
from scipy import *
3600**3400 * (exp(-3600)) / factorial(3400)
错误:不支持 long 和 float
尝试使用对数而不是直接使用数字。由于您的所有操作都不是加法或减法,因此您可以以对数形式完成整个操作并在最后转换回来。
计算如此量级的数字,你不能使用普通的 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
,因为我发起并仍然参与该项目,但我永远不会强烈声称它的浮点能力......我一直将它主要用于整数的东西......仍然,它确实使这种计算成为可能!-)。
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
好吧,错误正在发生,因为您正在尝试相乘
3600**3400
这是一个很长的
exp(-3600)
这是一个浮动。
但无论如何,您收到的错误掩盖了真正的问题。似乎 exp(-3600) 是一个太大的数字,无论如何都无法放入浮点数中。python 数学库充其量是变化无常的。