1
votes

Comment réparer "ZeroDivisionError: float division by zero"

J'ai la méthode calcularBeta1 . Lorsque j'exécute le programme, j'ai cette erreur:

ZeroDivisionError: division des flottants par zéro

class LecturaArchivo:
   datosArchivo = ListaEnlazada()
   operaciones = Operaciones()
   xTemporal = 0
   yTemporal = 0


   nombreArchivo = input('Nombre del archivo: ')
   archivo = open(nombreArchivo, "r")
   lineas = archivo.read()
   datos = lineas.split(',')
   datoProxy = float(input('Proxy: '))

   while lineas:
      lineas = archivo.readlines()
      xTemporal = datos[0]
      yTemporal = datos[1]

      datosArchivo.agregarNodoFinal(float(xTemporal), float(yTemporal))
  print(datos)

  sumaElementos = sum(datosArchivo.obtenerNodos())
  mediaElementos = operaciones.media(sumaElementos, datosArchivo.tamano())
  beta1 = operaciones.calcularBeta1(datosArchivo)
  print('Beta1: ', beta1)
  beta0 = operaciones.calcularBeta0(beta1, media)
  print('Beta0: ', beta0)
  yk = operaciones.calcularYK(beta0, beta1, datoProxy)
  print('Regresión Líneal: ', yk)

Méthode calcularBeta1

def calcularBeta1(self, lista):
    actual = lista.nodoInicio
    sumaXY = 0
    sumaX = 0
    sumaY = 0
    sumaXCuadrada = 0
    totalElementos = 0
    while actual != None:
        dato1 = actual.dato1
        dato2 = actual.dato2
        sumaXY += dato1 * dato2
        sumaX += dato1
        sumaY += dato2
        sumaXCuadrada += math.pow(dato1, 2)
        totalElementos += 1
        actual = actual.siguienteNodo

    resultadoB1 = (sumaXY - ((sumaX * sumaY ) / totalElementos )) / (sumaXCuadrada - math.pow(sumaX, 2) / totalElementos)
    return resultadoB1

Classe LecturaArchivo

 resultadoB1 = (sumaXY - ((sumaX * sumaY ) / totalElementos )) / (sumaXCuadrada - math.pow(sumaX, 2) / totalElementos)


3 commentaires

correction: ne divisez pas par zéro. Votre problème est dérivé des données - vous ne fournissez pas de données. Comment devrions-nous aider? Montrez-nous quelles entrées mènent à ce problème.


Après réflexion .. même si vous avez fourni des données .. si vos calculs sont corrects, vous ne pouvez pas faire grand-chose pour les empêcher - essayez: sauf: et invalidez qui calcule si cela conduit à une erreur-


Le problème est probablement que datosArchivo.nodoInicio est None. Vous ne pouvez pas calculer la version bêta d'un ensemble vide.


3 Réponses :


1
votes

Python est incapable de diviser les nombres par 0. Si jamais vous essayez de diviser par 0, python lancera une ZeroDivisionError , ce qui vous est arrivé. La meilleure façon de résoudre ce problème est simplement de ne pas diviser par zéro . Vous pouvez utiliser une instruction if pour vous assurer que les valeurs ne sont pas nulles.


3 commentaires

Je ne dirais pas que "Python est incapable" de diviser par 0. Python implémente correctement la division en disant qu'il est impossible de diviser par zéro.


@zvone true, mais python ne peut pas diviser par zéro car il est impossible de diviser par zéro.


c'est exactement ce que je veux dire;) je voulais juste préciser qu'il est correct de ne pas pouvoir le faire



2
votes

La ZeroDivisionError se produit lorsque vous essayez de diviser un nombre par 0, ce qui, comme vous le savez, est une impossibilité mathématique, changez simplement la valeur du dividende.


0 commentaires

1
votes

Ne divisez pas par zéro.

Dans l'expression dont il se plaint

resultadoB1 = (sumaXY - ((sumaX * sumaY ) / totalElementos )) / (sumaXCuadrada - math.pow(sumaX, 2) / totalElementos)

ce sera soit totalElementos , soit les résultats de sumaXCuadrada - math.pow (sumaX, 2) qui valent zéro.

Vous devrez ajouter du code pour gérer la possibilité de ces situations avant d'essayer de calculer cette formule.


3 commentaires

Vous voulez dire les résultats de: (sumaXCuadrada - math.pow (sumaX, 2) / totalElementos)


@J_Zoio Le résultat de cette division ne sera nul que si le numérateur est zéro.


@J_Zoio Non, j'ai écrit ce que je voulais dire. Si sumaXCuadrada - math.pow (sumaX, 2) est égal à zéro, alors sumaXCuadrada - math.pow (sumaX, 2) / totalElementos sera également nul (en supposant que totalElementos est non nul, mais j'ai déjà dit que le fait d'être nul serait également un problème).