2009-10-06 27 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