2014-09-03 25 views
0

我一直在嘗試使用Python來計算使用「梳」功能在SciPy的包概率。代碼如下:的Python(NumPy的和SciPy的)計算與大整數

p = 0 
for k in np.arange(8) + 1: 
    p += comb(8,k, exact = True)*k*8**(2*(2-k))*k**(2*k) 
    print(p) ## used to check the value of p in each iteration 
p /= 2**59 

但是,我得到的結果爲南。以下是P的值,每次迭代:結果:

8.881784197e-16 
2.44249065418e-15 
5.76210086589e-15 
1.35336620383e-14 
3.16282379379e-14 
-5.16631424912e-15 
-5.20085316827e-15 
nan 

要使其工作,我試圖做師在每次迭代:

p = 0 
for k in np.arange(8) + 1: 
    p += comb(8,k, exact = True)*k*8**(2*(2-k))*k**(2*k)/ 2**59 
    print(p) 

但這並沒有幫助,和我仍然有楠到底:

8.881784197e-16 
2.44249065418e-15 
5.76210086589e-15 
1.35336620383e-14 
3.16282379379e-14 
-5.16631424912e-15 
-5.20085316827e-15 
nan 

我假設這是由整數不同的表示引起:負值和男可能是由長期作爲解釋浮動造成的。事實上,當我一步一步的計算,它似乎工作:

In [155]: 
k = 8 
comb(8,k, exact = True)*k*8**(2*(8-k))*k**(2*k)/2**59 
Out[155]: 
0.00390625 

In [156]: 
k = 7 
comb(8,k, exact = True)*k*8**(2*(8-k))*k**(2*k)/2**59 + _ 
Out[156]: 
0.008122931679330314 

In [158]: 
k = 6 
comb(8,k, exact = True)*k*8**(2*(8-k))*k**(2*k)/2**59 + _ 
Out[158]: 
0.010721382431305493 
... 

任何想法如何解決這個問題?任何建議,非常感謝!

謝謝!

+0

我得到兩次警告(python3): 'RuntimeWarning:除以零long_scalars'遇到 'RuntimeWarning:在double_scalars' – undershock 2014-09-03 19:44:18

回答

3

只要改變np.arange(8) + 1range(1,9)

補充說明:您遇到的問題是np.arange正在生成int32數字,最大值僅超過20億。當你計算8**np.int_(-11)這被計算爲1./(8**np.int_(11)),括號內的表達顯着超過2十億,所以你得到的溢出。

hth。

+0

@Warren遇到無效值:對。答案調整並添加了解釋。謝謝。 (請注意,出於類似的原因,如果我們強制指數爲浮點數,它也會修正事情。) – Alan 2014-09-03 21:08:02

+0

非常感謝。這真的有助於:) – user3821012 2014-09-04 03:18:25