2009-10-06 72 views
0

我试图计算此:操作太久,浮在Python

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

错误:不支持长和浮

+0

和你的问题是什么? – SilentGhost 2009-10-06 14:58:48

+0

发生错误。而不是输出。 – wildfire 2009-10-06 15:01:28

+0

我们知道*错误发生*,如果一切正常,您不会在这里写信,是吗? – SilentGhost 2009-10-06 15:01:31

回答

0

嘛错误来了约,因为你试图乘

3600**3400 

这是一个长与

exp(-3600) 

这是一个浮点数。

但无论如何,您收到的错误是掩盖真正的问题。无论如何,看起来exp(-3600)的数字太大了。充其量,蟒蛇数学图书馆是变幻莫测的。

+1

其实exp(-3600)是一个非常小(接近于零)的数字 – 2009-10-06 15:43:29

+0

我相信你的意思是3600 ** 3400是一个数字太大以至于无论如何都适合浮动。顺便说一句,math.exp(-3600)== 0.0 – foosion 2009-10-06 15:58:01

3

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

1

您可以尝试使用Decimal对象。计算速度会比较慢,但对于非常小的数字你不会有问题。

from decimal import Decimal 

但是,我不知道Decimal与scipy模块的交互方式。

这可能与numpy discussion有关。

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,当然,因为我起源和仍然参与该项目,但我从来没有对其浮点数能力强大的声明...我一直主要用于整数的东西......仍然,它确实做这个计算可能!-)。

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