Manejar la Precisión de Punto Flotante
En este paso, discutiremos cómo manejar la precisión de punto flotante cuando se comparan números de punto flotante con cero. Debido a la forma en que se representan los números de punto flotante en las computadoras, a menudo están sujetos a pequeños errores de redondeo. Esto puede llevar a resultados inesperados cuando se los compara directamente con cero.
Por ejemplo, un cálculo que teóricamente debería dar como resultado cero en realidad podría producir un número no nulo muy pequeño como 1e-16
(0.0000000000000001). Comparar directamente este número con cero utilizando ==
devolverá False
, lo cual podría no ser el resultado deseado.
Para manejar esto, normalmente se utiliza un valor de tolerancia (también conocido como épsilon) para verificar si un número de punto flotante está "lo suficientemente cerca" de cero.
Creemos un script de Python para demostrar esto.
-
Abra el editor de VS Code en el entorno de LabEx.
-
Cree un nuevo archivo llamado float_precision.py
en el directorio ~/project
.
~/project/float_precision.py
-
Agregue el siguiente código a float_precision.py
:
## Import the math module
import math
## Define a tolerance value (epsilon)
tolerance = 1e-9 ## A small value like 0.000000001
## A floating-point number that is very close to zero due to calculation
number = 1e-10
## Direct comparison with zero (may fail)
if number == 0:
print("Direct comparison: number is zero")
else:
print("Direct comparison: number is not zero")
## Using tolerance to compare with zero
if math.isclose(number, 0, abs_tol=tolerance):
print("Comparison with tolerance: number is close to zero")
else:
print("Comparison with tolerance: number is not close to zero")
## Another example with a slightly larger number
number = 1e-7
## Direct comparison with zero (will fail)
if number == 0:
print("Direct comparison: number is zero")
else:
print("Direct comparison: number is not zero")
## Using tolerance to compare with zero
if math.isclose(number, 0, abs_tol=tolerance):
print("Comparison with tolerance: number is close to zero")
else:
print("Comparison with tolerance: number is not close to zero")
Este script demuestra cómo usar la función math.isclose()
con un valor de tolerancia para comparar números de punto flotante con cero.
-
Guarde el archivo.
-
Ejecute el script utilizando el comando python
en la terminal:
python float_precision.py
Debería ver la siguiente salida:
Direct comparison: number is not zero
Comparison with tolerance: number is close to zero
Direct comparison: number is not zero
Comparison with tolerance: number is not close to zero
Como puede ver, la comparación directa falla porque el número no es exactamente cero. Sin embargo, cuando se utiliza un valor de tolerancia con math.isclose()
, la comparación identifica correctamente que el número está cerca de cero.
La función math.isclose()
verifica si dos valores de punto flotante están cerca el uno del otro dentro de una tolerancia especificada. El argumento abs_tol
especifica la tolerancia absoluta. Si la diferencia absoluta entre los dos números es menor o igual a la tolerancia, la función devuelve True
.
Al utilizar un valor de tolerancia, se pueden evitar los problemas causados por la precisión de punto flotante y garantizar que las comparaciones con cero sean precisas y confiables.