From 417c009813b88b549c44635805ffecc8c7f1ce3f Mon Sep 17 00:00:00 2001 From: Jhoseph Date: Wed, 3 Dec 2025 00:33:08 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20evitar=20resultados=20complejos=20para?= =?UTF-8?q?=20ra=C3=ADces=20pares=20negativas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Validar bases negativas con raíces pares en calculator.py - Manejar error de 'Raíz negativa' en la GUI - Agregar caso de prueba para operaciones de raíz inválidas --- src/calculator.py | 7 +++++++ src/gui.py | 9 +++++++-- tests/test_calculator.py | 3 ++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/calculator.py b/src/calculator.py index 4995fb6..0a379ea 100644 --- a/src/calculator.py +++ b/src/calculator.py @@ -105,6 +105,13 @@ def power(base: float, exponent: float) -> float: >>> power(5, 0) 1 """ + + if base < 0 and exponent != 0: + inv_exp = 1 / exponent + if abs(inv_exp - round(inv_exp)) < 1e-10: + if round(inv_exp) % 2 == 0: + raise ValueError("Raíz negativa") + return base ** exponent def valor_maximo(a: float, b: float) -> float: diff --git a/src/gui.py b/src/gui.py index 26b6c6c..308502d 100644 --- a/src/gui.py +++ b/src/gui.py @@ -331,6 +331,7 @@ def operation_click(self, operation): >>> # Con paréntesis: (2+3)*4 >>> # expression = "(2+3)*4" """ + # Si estamos en modo expresión (con paréntesis) if self.use_expression_mode: self.expression += operation self.display.delete(0, tk.END) @@ -462,9 +463,13 @@ def equals_click(self): self.first_number = None self.operator = None - except ValueError: - self.show_error("Entrada inválida") + except ValueError as e: + if str(e) == "Raíz negativa": + self.show_error("Raíz negativa") + else: + self.show_error("Entrada inválida") return + except ZeroDivisionError: self.show_error("No se puede dividir por 0") return diff --git a/tests/test_calculator.py b/tests/test_calculator.py index 3ced422..636d34b 100644 --- a/tests/test_calculator.py +++ b/tests/test_calculator.py @@ -53,7 +53,8 @@ def test_power(): assert power(-2, 3) == -8 assert power(-2, 0) == 1 assert power(-2, -3) == -0.125 - # assert power(-4, 0.5) == -2.0, "Error: la raíz cuadrada de un número negativo no es real" + with pytest.raises(ValueError, match="Raíz negativa"): + power(-4, 0.5) def test_valor_maximo():