2017-09-30 179 views
1

我用下面的代碼運行到錯誤在標題中遇到溢出:Python的錯誤:RuntimeWarning:在double_scalars

from scipy import special as sp 
def func(x, n): 
    coefs = [[0] * (n+1) for _ in range(n+1)] 
    for i in range(n+1): 
      for j in range(i+1): 
        if j <=x: 
          coefs[i][j] = sp.binom(i, j) 
        else: 
          sumation = 0 
          for k in range(x+1): 
            sumation = sumation + coefs[i - k - 1][j - k] 
          coefs[i][j] = sumation 

運行此與

print(func(10, 1500)) 

返回錯誤:

RuntimeWarning: overflow encountered in double_scalars 
sum = sum + list[i - k - 1][j - k] 

它可以工作直到剛剛過去n = 1000

我正在使用python 3.6。我認爲這個版本的python中的數字可以是任何大小,但我是新手,所以我可能會錯過一些東西。

任何幫助克服這一點,將不勝感激。

謝謝

+0

'i'的價值是什麼? – malioboro

+0

X vinny

+0

能發佈錯誤信息 – Mitiku

回答

0

一些觀察:首先,它運行在我的機器上沒有錯誤;第二,print(func(10, 1500))通話總是打印None,因爲func()不返回任何內容;第三,它創建了1501乘1501矩陣狀結構,但僅對每行的前11個元素進行操作,而將每行的最後1490個元素設置爲0,這看起來很奇怪,就好像索引範圍不正確一樣。

第四,你已經重新定義了Python的內置函數的名稱作爲變量這不是一個好主意,因爲你不能在你的函數範圍內使用他們的初衷:

>>> list 
<class 'list'> 
>>> sum 
<built-in function sum> 
>>> 

五,你是否知道,這些指標之一:

sum = sum + list[i - k - 1][j - k] 

在時間走向負:

sum = sum + list[10][-5] 

所以你從左端訪問這一行(其中所有的零都是)。

第六,現在你添加了一個對sp.binom(i, j)的調用,當我用有問題的錯誤運行它時,它失敗了。你知道sp.binom()返回一個numpy.float64,它不能像Python整數那樣大小。

我在運行Python 3.6.0 - 也許你可以提供更多關於你的環境的信息。

I thought that numbers could be any size in this version of python

list最後一行是:

[1, 746, 185755, 23157624, 1736848299, 87162383901, 3138960008701, 85259372826713, 1813040043422321, 31075927633744029, 439493479567385970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

所以數大小似乎並不成爲一個問題。

+0

我也在python 3.6。 (也沒有發現,我真的只需要第一個x元素哈哈我會改變這一點) – vinny

+0

不知道還有什麼可能是不同的。確切的代碼會拋出錯誤對我來說 – vinny

+1

@vinny,嘗試將您的'list'和'sum'變量重命名爲唯一名稱,以查看是否有任何區別。 – cdlane