2014-09-11 71 views
1
import math 
a = 100 
b = 110 
e = 2.71828 
x = (e**-a)*(a**b)/math.factorial(b) 
print round(x, 5) 

當a和b是大我得到這個消息:溢出錯誤:..long詮釋過大

Traceback (most recent call last): 
    File "<stdin>", line 5, in <module> 
OverflowError: long int too large to convert to float 
+0

'math.factorial(b)'== 198之前小! == 1.98..e370比Double.MaxValue大 – 2014-09-11 08:21:10

+0

似乎很明顯:值太大 – sapi 2014-09-11 08:21:23

+0

如何解決這個問題? – 2014-09-11 08:22:57

回答

1

只要(A ** B)>> math.factorial(二),你可以只是做

(a**b)/math.factorial(b)*(e**-a) 

這樣的數量得到被轉換爲浮動

1

您已超出最大浮點值(1.7976931348623157e+308)。

使用decimal模塊:

import math 
from decimal import Decimal 
a = 200 
b = 198 
e = 2.71828 
x = Decimal(e**-a)*Decimal(a**b)/math.factorial(Decimal(b)) 
print round(x, 5) 

輸出:

0.02806 

WloframAlpha計算0.0280567


如果你想看到的浮動信息輸出比較它,見this

>>> import sys 
>>> print sys.float_info 
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1) 
+0

有趣。這適用於198,但會隨着數字的增加而快速填滿整個記憶,或者我錯了嗎? – JulienD 2014-09-11 08:40:04

+0

我相信你是對的:) – 0x90 2014-09-11 08:50:32

4

您似乎試圖實施泊松分佈。對於其平均值的大數值,它非常接近高斯分佈,因此您不需要計算階乘(這與其他人已經說過的那樣太大)。

http://en.wikipedia.org/wiki/Poisson_distribution#Related_distributions

編輯:事件k的數目爲平均的獨立的,但通常是一個不希望諸如P的概率(200 | L)爲小L,或一種其四捨五入到零。

也看看SciPy的的實現,這似乎是使用對數,另一種方式或避免非常大的數字: https://github.com/scipy/scipy/blob/v0.14.0/scipy/stats/_discrete_distns.py

編輯:因爲它要求,在R A演示(因爲它是在我目前的設置中更快,但數學是相同的)。我把波長=平均值=西格馬^ 2 = 500(沒有對於n < 1000連續性校正):

pois = rpois(1000, 500) 
norm = rnorm(1000, 500, sqrt(500)) 
plot(density(pois)) 
lines(density(norm)) 

enter image description here

+0

你是怎麼知道OP的意志的? – 0x90 2014-09-11 08:33:22

+0

該公式很容易識別。出於類似的原因,我必須用泊松函數來近似二項式。在某些時候,即使使用Decimal,您也會達到硬件的極限。 – JulienD 2014-09-11 08:38:27

+0

是的,這是泊松,我不知道他與高斯類似,謝謝 – 2014-09-11 08:47:31