2014-12-11 91 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