Redondeo y aproximaciones
Introducción
La precisión de los números es fundamental en la programación científica. En Python, los números reales no son representados exactamente debido a las limitaciones inherentes a la representación en punto flotante. Esto puede llevar a resultados inesperados si no se maneja adecuadamente. En esta lección, exploraremos cómo trabajar con precisión y realizar redondeos de manera efectiva para obtener resultados más precisos.
Explicación principal
En Python, los números reales son representados en formato IEEE 754, lo que limita su precisión. Esto puede ser problemático cuando se realizan cálculos iterativos o cuando se compara con valores conocidos. Por ejemplo:
print(0.1 + 0.2 == 0.3) # Salida: False
Aunque intuitivamente se espera que 0.1 + 0.2 sea igual a 0.3, la representación en punto flotante hace que esta afirmación no sea verdadera.
Para manejar este problema, Python proporciona varias funciones de redondeo y métodos para trabajar con precisión numérica. Veamos algunos ejemplos:
import math
# Ejemplo 1: Redondear a un número específico de decimales
print(round(0.1 + 0.2, 1)) # Salida: 0.3
# Ejemplo 2: Usar math.ceil y math.floor para redondeo hacia arriba o abajo
numero = 3.75
print(math.ceil(numero)) # Salida: 4
print(math.floor(numero)) # Salida: 3
# Ejemplo 3: Redondear a la decena más cercana
print(round(123.456, -1)) # Salida: 120
Errores típicos / trampas
- Redondeo excesivo: Redondear demasiado puede llevar a una pérdida innecesaria de precisión. Por ejemplo:
print(round(0.1 + 0.2, 5)) # Salida: 0.30000 (perdida de precisión)
- Uso inadecuado de
==: Comparar números reales con operadores como==puede dar resultados inesperados:
print(0.1 + 0.2 == 0.3) # Salida: False (debido a la representación en punto flotante)
- No usar funciones de redondeo: No utilizar funciones como
round()o módulos matemáticos puede llevar a resultados imprecisos:
resultado = 0.1 + 0.2
if resultado == 0.3:
print("Igual")
else:
print("No igual") # Salida: No igual, pero en realidad deberían ser iguales
Checklist accionable
A continuación, te presentamos un checklist para manejar la precisión y redondeo de manera efectiva:
- Utiliza
round()para redondear a un número específico de decimales:
resultado = round(0.1 + 0.2, 1)
- Evita usar
==para comparar números reales:
if abs(resultado - esperado) < 0.0001:
print("Igual")
else:
print("No igual")
- Utiliza funciones matemáticas como
math.ceil()omath.floor()para redondeo:
resultado = math.ceil(3.75)
- Redondea solo cuando sea necesario, evitando pérdida innecesaria de precisión:
resultado = 0.1 + 0.2
if abs(resultado - 0.3) < 0.0001:
print("Igual")
else:
print("No igual")
- Comprueba la precisión de tus cálculos iterativos:
def sumar_iterativamente(n):
resultado = 0
for _ in range(n):
resultado += 0.1
return round(resultado, 1)
print(sumar_iterativamente(10)) # Salida: 1.0 (si se redondea adecuadamente)
Cierre
Siguientes pasos
- Aprender a trabajar con números reales precisos: Utiliza
round()y funciones matemáticas para manejar la precisión de manera efectiva. - Practica comparaciones de números reales: Usa
abs(resultado - esperado) < toleranciaen lugar de==. - Aplica estas técnicas a tus proyectos científicos: Esto te ayudará a obtener resultados más precisos y confiables.
Siguiendo estos pasos, podrás mejorar la precisión de tus cálculos numéricos y evitar problemas inherentes a la representación en punto flotante.