¿Por qué los cálculos en coma flotante son imprecisos en Python?

¿Alguien se ha encontrado en una situación similar? ¿Es un error o puede solucionarse?
0
{0} / {1} caracteres recomendados
La respuesta debe contener algún carácter
Respuestas
Dante Nicolás Caballero
Hola Jeff, los cálculos en coma flotante son imprecisos en Python porque los números decimales no pueden representarse exactamente como fracciones binarias en la máquina. Esto significa que hay una pequeña diferencia entre el valor decimal que ingresás y el valor binario que se almacena. Python muestra una aproximación decimal redondeada del valor binario, pero no es el valor exacto. Por ejemplo, el valor decimal 0.1 se almacena como la fracción binaria 3602879701896397 / 2 ** 55, que es aproximadamente 0.1000000000000000055511151231257827021181583404541015625. Esto no es un error de Python, sino una limitación de la aritmética de coma flotante en general. Para obtener mayor precisión, podés usar la clase Decimal del módulo decimal de Python, que ofrece aritmética decimal de punto fijo y punto flotante. También podés usar el módulo math para convertir un número de coma flotante en un entero. Espero que esto te ayude a entender mejor el problema.
Escribe una respuesta
0
Rubén Escobedo
Buenas Jeff, para completar la respuesta del compañero Dante, cabe añadir que muchas librerías de Python orientadas al cálculo (usadas también en la tan conocida Inteligencia Artificial) como numpy o torch permiten trabajar con distinta precisión. Esto significa que, para almacenar el mismo dato, usarás más o menos memoria y, por lo tanto, tendrás una aproximación mejor o peor. Las más comunes son float 16 o 32 (16 o 32 bytes de memoria). Finalmente, por si no lo sabías, esto no pasa con los enteros, que en Python tienen "precisión infinita" (limitado solo por el hecho de que estás trabajando con una máquina finita), dado que la memoria que ocupan es seleccionada de forma dinámica.
Escribe una respuesta
0
Vicente Jiménez Rico
Hola Jeff, Los cálculos en coma flotante pueden ser imprecisos en Python, al igual que en otros lenguajes de programación, debido a la representación interna de los números de punto flotante en la computadora. Python utiliza el estándar IEEE 754 para representar números en coma flotante, que utiliza una representación binaria para almacenar números reales. Sin embargo, esta representación binaria no puede representar todos los números reales de manera exacta, lo que puede llevar a errores de redondeo y pérdida de precisión en ciertas operaciones aritméticas. Por ejemplo, algunos números decimales simples, como 0.1 o 0.2, no pueden representarse exactamente en binario y pueden dar lugar a resultados inesperados en operaciones aritméticas. Además, la precisión de los cálculos en coma flotante también puede estar limitada por la cantidad de bits utilizados para representar la parte fraccionaria y la parte entera de un número. En Python, el tipo de datos `float` utiliza 64 bits de precisión, pero aún así puede haber pérdida de precisión en ciertos cálculos debido a la naturaleza finita de la representación binaria de los números reales. Para evitar problemas de precisión en cálculos críticos, es importante tener en cuenta estas limitaciones y utilizar técnicas como el redondeo adecuado, el uso de tipos de datos de precisión extendida (como `decimal.Decimal` en Python) o el diseño de algoritmos numéricos más robustos. Te pongo un ejemplo con código; # Ejemplo de cálculo en coma flotante impreciso resultado = 0.1 + 0.2 # Imprimir el resultado print("El resultado de 0.1 + 0.2 es:", resultado) El resultado sería; El resultado de 0.1 + 0.2 es: 0.30000000000000004 Espero haberte resuelto la consulta, un saludo Vicente
Escribe una respuesta
0
Andrés Soto Villaverde
La representación interna de los números en coma flotante en el ordenador utiliza una cantidad limitada de dígitos binarios (bits). Si al realizar una operación se sobrepasa dicha cantidad, se desechan los bits menos significativos con lo cual se pierde precisión. Esto es un problema general de los ordenadores, no solo de Python.
Escribe una respuesta
0
Yuriy
El problema no está en los cálculos, sino en la forma en que se almacenan los números de coma flotante. Estos números se almacenan como fracciones binarias, pero desafortunadamente, la mayoría de las fracciones decimales no se pueden representar exactamente como fracciones binarias. Python muestra números con redondeo "humanizado" para mejorar la legibilidad. Este problema no es exclusivo de Python, sino de todos los lenguajes que admiten la aritmética de punto flotante. Si ha ocurrido tal problema y es importante resolverlo, ya que la precisión del cálculo resultante es insuficiente, entonces se puede resolver, pero el método de solución dependerá de la situación específica en la que surgió el problema.
Escribe una respuesta
0
Antonio Fernández Alonso
Profesor Pro
Hola, Jeff: Las respuestas que te han dado te explican bien el motivo por el cual los números (no solo los cálculos) en coma flotante pueden no ser siempre precisos. Sin embargo, quizá no comprendas tan fácilmente la causa por la cual esto sucede. Básicamente, se debe a que hay muchos más números en coma flotante (infinito) que el que podemos representar en un número (finito) de bytes. Para que los comprendas mejor, imagine que tu ordenador solo permite representar 200 números enteros distintos (negativos y positivos). Una opción sería coger el rango de -100 a 100, con lo cual tienes precisión exacta pero un rango muy pequeño. La otra opción sería coger un rango de -1000 a 1000, que nos permite mucho mayor rango, a costa de perder precisión, puesto que nuestro ordenador solo puede representar ("almacenar") 200 números distintos. ¿Qué significa esta pérdida de precisión y cómo afecta a cómo se representan, internamente, los números en el ordenador? Con la primera opción, había una relación directa entre un valor y su representación: al número -100 le hacíamos corresponder la representación interna -100; al número -99 le hacíamos corresponder la representación interna -99; y así sucesivamente. Con la segunda opción (la que se aplica, a grandes rasgos, con la norma IEEE754 para coma flotante), se hace una relación entre una selección de los números (los valores que queremos representar; es decir, 2.000 valores) y se relaciona con una, y solo una, de las representaciones que permite internamente el ordenador (es decir, 200 representaciones). En otras palabras, debemos elegir cuáles de esos 2.000 valores se corresponderán con los 200 disposnibles; por ejemplo, el valor -1000 con la representación -100, el valor -950 con la representación -99, , el valor -900 con la representación -98, y así sucesivamente. ¿Qué pasa entonces con los valores que no están representados? Se representan por uno de los que tiene a su alrededor; por ejemplo, el valor -920 se representaría con el -98 (el que habíamos hecho corresponder con el valor -900). De esta forma, podemos utlizar más valores, pero a costa de la previsión. Con los números flotantes, es un poco más complicado que esto (además de reglas de cálculo, hay representaciones con significado especial), pero la ideal básica es ésta.
Escribe una respuesta
0