Python:ZeroDivisionError:浮点除零

时间:2014-12-11 02:12:39

标签: python error-handling

我有这些代码,但它给出了零分割错误。我无法弄清楚出了什么问题。我需要你的帮助。谢谢。 :)

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

2 个答案:

答案 0 :(得分: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!

实际上, no 输入也会产生此错误,因为for中的regresilinear循环永远不会改变其默认{sum*变量1}}值。

如果您确定您的输入并未执行此操作,您可能需要在0.0中添加print语句,以了解{{1}被设置为零。 (或者如果您熟悉它,请使用regresilinear调试器。)

PS:如果函数不依赖于det等全局数据,那么调试函数要容易得多。您甚至不需要它,因为它应该始终等于三个列表pdbndatax的长度。

PPS:datay完全忽略其datae参数。因此,如果硬编码的readdatafile文件恰好存在但是为空,那么您将获得完全相同的filename

答案 1 :(得分:0)

您的变量e是什么样的?那就是它包含什么?如果其值为零,则表示您的答案。