CodeGym /Cursos /Python SELF ES /Trabajo con números de punto flotante

Trabajo con números de punto flotante

Python SELF ES
Nivel 5 , Lección 4
Disponible

4.1 Redondeo de números de punto flotante

Los números de punto flotante (decimales) se llaman en inglés floating point number — números con punto flotante: en EE.UU., se usa un punto para separar la parte entera de la decimal. De ahí viene el nombre float.

Como ya hemos discutido, al convertir un número de punto flotante (float) a un entero (int), siempre se redondea hacia abajo al entero más cercano — su parte decimal simplemente se descarta. Pero podemos imaginar fácilmente una situación donde el número decimal necesita ser redondeado al entero más cercano. ¿Qué hacer en esa situación?

Para ello, en Python existe una función incorporada round(). Fue inventada incluso antes de la creación de la biblioteca math, por eso no forma parte de ella. Las funciones para redondear hacia abajo y hacia arriba se encuentran en la biblioteca math.

La función round() redondea el número al entero más cercano:


round(número_de_punto_flotante)

Esta función devolverá el número entero más cercano al número de punto flotante pasado a ella. Es importante destacar que si la parte decimal del número es 0.5, la función round() utiliza el método de redondeo al número entero par más cercano. Esto se llama "redondeo bancario" y permite reducir el error sistemático en rondas múltiples. Por ejemplo:

Ejemplos:

Comando Resultado
x = round(4.1) 4
x = round(4.5) 4
x = round(4.9) 5
x = round(5.5) 6
La función math.ceil() redondea el número hacia arriba, ejemplos:

Comando Resultado
x = math.ceil(4.1) 5
x = math.ceil(4.5) 5
x = math.ceil(4.9) 5

La función math.floor() redondea el número hacia abajo, ejemplos:

Comando Resultado
x = math.floor(4.1) 4
x = math.floor(4.5) 4
x = math.floor(4.9) 4

Aunque para redondear un número hacia abajo es más sencillo usar la función de conversión de tipos int():

Comando Resultado
x = int(4.9) 4

Si te cuesta recordar estos comandos, un pequeño truco en inglés te ayudará:

  • math — matemáticas
  • round — redondear
  • ceiling — techo
  • floor — suelo

4.2 Estructura de los números de punto flotante

El tipo float en Python puede almacenar valores en el rango de -1.7*10308 a +1.7*10308. Este rango gigante de valores se explica por la estructura del tipo float, que es diferente a la de los tipos enteros. Cada variable tipo float contiene dos números: el primero se llama mantisa y el segundo — exponente.

Supongamos que tenemos el número 123456789, y lo hemos guardado en una variable de tipo float. Entonces el número se convertirá en 1.23456789*108, y dentro del tipo float se almacenarán dos números — 23456789 y 8. En rojo está la "parte significativa del número" (mantisa), en verde — el exponente.

Este enfoque permite almacenar tanto números muy grandes como muy pequeños. Pero dado que el tamaño del número está limitado a 8 bytes (64 bits) y parte de los bits se utiliza para almacenar el exponente (así como el signo del número y el signo del exponente), la longitud máxima de la mantisa está limitada a 15 dígitos.

Esta es una descripción muy sencilla de la estructura de los números de punto flotante, puedes buscar una más detallada en Internet.

4.3 Pérdida de precisión al trabajar con números de punto flotante

Al trabajar con números de punto flotante siempre hay que tener en cuenta que los números de punto flotante son inexactos. Siempre habrá errores de redondeo, errores de conversión de decimal a binario y, finalmente, el más común — pérdida de precisión al sumar/restar números de tamaños muy diferentes.

Esta última es la situación más inesperada para los principiantes en programación.

Si restamos de un número 109 1/109, obtendremos nuevamente 109.

Resta de números de tamaños muy diferentes Explicación

1000000000.000000000 - 0.000000001 1000000000.000000000 
El segundo número es demasiado pequeño, y su parte significativa es ignorada (resaltado en gris). En naranja se destacan los 15 dígitos significativos.

¿Qué más se puede decir? Programar no es igual a matemáticas.

4.4 El peligro de comparar números de punto flotante

Otro peligro acecha a los programadores al comparar números de punto flotante. Dado que al trabajar con estos números pueden acumularse errores de redondeo, es posible que se presenten situaciones en las que los números de punto flotante deberían ser iguales, pero no lo son. Y viceversa: los números deberían no ser iguales, pero lo son.

Ejemplo:

Comando Explicación
a = 1000000000.0 b = 0.000000001 c = a – b

En la variable a estará el valor 1000000000.0

En la variable c estará el valor 1000000000.0

(el número en la variable b es demasiado pequeño)

En el ejemplo anterior, a y c no deberían ser iguales, pero lo son.

O tomemos otro ejemplo:

Comando Explicación
a = 1.00000000000000001 b = 1.00000000000000002

En la variable a estará el valor 1.0

En la variable b estará el valor 1.0

En la práctica, los números de punto flotante se comparan así:

Se toma un número muy pequeño. Si la diferencia entre los números (en valor absoluto) es menor que este número pequeño, se consideran iguales. Ejemplo:


a = 0.00000000012
b = 0.000000000011 

if abs(a - b) < 0.00001:
    print("son iguales")
else:
    print("no son iguales")
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION