我正在尝试计算:
from scipy import *
3600**3400 * (exp(-3600)) / factorial(3400)
错误:不支持long和float
答案 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