2014-12-11 137 views
1

我已經得到了這些代碼,但它給出了一個零除法錯誤。我無法弄清楚什麼是錯的。我需要你的幫助。謝謝。 :)Python:ZeroDivisionError:浮點除零

from math import sqrt 

def inisialisasi(): 
    filename = raw_input('File will be read? ') 
    return filename 


def readdatafile(filename): 
    datafile = open('kalibration.txt','r') 
    datax = []; datay = []; datae = []; i = 0 
    for row in datafile: 
     i +=1 
     data = row.split() 
     x = float(data[0]) 
     datax.append(x) 
     y = float(data[1]) 
     datay.append(y) 
     e = float(data[2]) 
     datae.append(e) 
     print 'x = %5.2f y = %5.2f e = %5.2f' % (x, y, e) 

    datafile.close() 
    n = i 
    print 'Jumlah data = ', n 
    return n, datax, datay, datae 


def regresilinear(x, y, e): 
    sum1=0.0; sum2=0.0; sum3=0.0; sum4=0.0; sum5=0.0 
    for i in range(0, n): 
     sum1=sum1+(x[i]**2/e[i]**2) 
     sum2=sum2+(y[i]/e[i]**2) 
     sum3=sum3+(x[i]/e[i]**2) 
     sum4=sum4+(x[i]*y[i])/e[i]**2 
     sum5=sum5+1/e[i]**2 

    det = (sum5*sum1)-sum3**2 
    #parameter a dan b 
    a = ((sum1*sum2)-(sum3*sum4))/det 
    b = ((sum5*sum4)-(sum3)*(sum2))/det 
    #ralat 
    sigmaa2 = sum1/det 
    sigmab2 = sum5/det 
    sigmaa = sqrt(sigmaa2) 
    sigmab = sqrt(sigmab2) 

    return a, b, sigmaa, sigmab 

filename = inisialisasi() 
n, datax, datay, datae = readdatafile(filename) 

a, b, sigmaa, sigmab = regresilinear(datax,datay, datae) 

print 'a= %8.6f b= %8.6f sigmaa= %8.6f sigmab= %8.6f' % (a, b, sigmaa, sigmab) 

錯誤:

Traceback (most recent call last): 

File "coba6.py", line 55, in 

a, b, sigmaa, sigmab = regresilinear(datax, datay, datae) 

File "coba6.py", line 42, in regresilinear 

a = ((sum1*sum2)-(sum3*sum4))/det 

ZeroDivisionError: float division by zero 

回答

0

什麼是您的變量e樣子?那是什麼呢?如果它的值爲零,你有你的答案。

2

不知何故,det設置等於0。由於你永遠不會明確地阻止這種情況的發生,因此一條輸入線就像...

1.0 <whatever> 1.0 

...可以導致除以零。 (該y值不會在這種情況下無所謂。)取代後,您將有:

sum1 = 0.0 + 1.0**2/1.0**2 # sum1 == 1.0 
sum3 = 0.0 + 1.0/1.0**2  # sum3 == 1.0 
sum5 = 0.0 + 1/1.0**2  # sum5 == 1.0 
det = 1.0 * 1.0 - 1.0**2  # det == 0.0 
... 
a = <whatever>/det # KABOOM! 

其實,沒有輸入也會產生這個錯誤,因爲for迴路regresilinear永遠不會改變各種sum*變量的默認值爲0.0

如果你確保您輸入不這樣做,你可能需要添加內部regresilinearprint報表看det是如何越來越設置爲零。 (或者使用pdb調試器,如果您熟悉它的話)。

PS:如果它們不依賴於像n這樣的全局數據,調試功能會容易得多。你甚至不需要它,因爲它應該總是等於三個列表dataxdataydatae的長度。

PPS:readdatafile完全忽略了其參數filename。因此,如果硬編碼的kalibration.txt文件碰巧存在但是爲空,您將得到完全相同的ZeroDivisionError