floating point - programacion - ¿Cómo se almacena el punto flotante? ¿Cuándo importa?
punto flotante metodos numericos (10)
En el seguimiento de esta pregunta , parece que algunos números no se pueden representar por coma flotante y, en cambio, son aproximados.
¿Cómo se almacenan los números de coma flotante?
¿Hay un estándar común para los diferentes tamaños?
¿De qué tipo de problemas tengo que tener cuidado si uso el punto flotante?
¿Son compatibles con varios idiomas (es decir, con qué conversiones necesito tratar para enviar un número de punto flotante desde un programa de Python a un programa de C sobre TCP / IP)?
-Adán
En el seguimiento de esta pregunta, parece que algunos números no se pueden representar por coma flotante y, en cambio, son aproximados.
Correcto.
¿Cómo se almacenan los números de coma flotante? ¿Hay un estándar común para los diferentes tamaños?
Como ya se mencionó en los otros carteles, casi exclusivamente IEEE754 y su sucesor IEEE754R. Buscar en Google te da mil explicaciones junto con patrones de bits y su explicación. Si todavía tiene problemas para obtenerlo, existen dos formatos de FP aún más comunes: IBM y DEC-VAX. Para algunas máquinas esotéricas y compiladores (BlitzBasic, TurboPascal) hay algunos formatos extraños.
¿De qué tipo de problemas tengo que tener cuidado si uso el punto flotante? ¿Son compatibles con varios idiomas (es decir, con qué conversiones necesito tratar para enviar un número de punto flotante desde un programa de Python a un programa de C sobre TCP / IP)?
Prácticamente ninguno, son compatibles con otros idiomas.
Rarezas que ocurren muy raras:
IEEE754 define sNaNs (NaNs de señalización) y qNaNs (NaNs silenciosos). Los primeros causan una trampa que obliga al procesador a llamar a una rutina de controlador si está cargada. Los últimos no hacen esto. Debido a que los diseñadores de lenguaje odiaban la posibilidad de que los sNaN interrumpan su flujo de trabajo y los apoyen para exigir el soporte de las rutinas del manejador, los sNaN casi siempre se convierten silenciosamente en qNaNs. Por lo tanto, no confíe en una conversión bruta 1: 1. Pero nuevamente: esto es muy raro y ocurre solo si hay NaN presentes.
Puede tener problemas con endianness (los bytes están en el orden incorrecto) si se comparten archivos entre computadoras diferentes. Es fácilmente detectable porque obtiene números de NaN para números.
Básicamente, de lo que debe preocuparse en números flotantes es que hay un número limitado de dígitos de precisión. Esto puede causar problemas cuando se prueba la igualdad, o si su programa realmente necesita más dígitos de precisión que los que le proporciona ese tipo de datos.
En C ++, una buena regla es pensar que un flotador te da 7 dígitos de precisión, mientras que un doble te da 15. Además, si estás interesado en saber cómo probar la igualdad, puedes mirar this hilo de pregunta.
Como se mencionó, el artículo de Wikipedia sobre IEEE 754 hace un buen trabajo al mostrar cómo se almacenan los números de coma flotante en la mayoría de los sistemas.
Ahora, aquí hay algunos consejos comunes:
- Lo más importante es que casi nunca desea comparar dos números de coma flotante para la igualdad (o desigualdad). En su lugar, querrá usar comparaciones mayores que / menores que.
- Cuantas más operaciones realice en un número de punto flotante, más significativos serán los errores de redondeo.
- La precisión está limitada por el tamaño de la fracción, por lo que es posible que no pueda agregar correctamente los números que están separados por varios órdenes de magnitud. (Por ejemplo, no podrá agregar 1E-30 a 1E30).
El estándar es IEEE 754 .
Por supuesto, hay otros medios para almacenar números cuando IEE754 no es lo suficientemente bueno. Las bibliotecas como BigDecimal
de Java están disponibles para la mayoría de las plataformas y se asignan bien al tipo de número de SQL. Los símbolos se pueden usar para números irracionales, y las relaciones que no se pueden representar con precisión en puntos flotantes binarios o decimales se pueden almacenar como una relación.
En cuanto a la segunda parte de su pregunta, a menos que el rendimiento y la eficiencia sean importantes para su proyecto, le sugiero que transfiera los datos de punto flotante como una cadena sobre TCP / IP. Esto le permite evitar problemas como la alineación de bytes y facilitará la depuración.
En el artículo Lo que todos los científicos deberían saber sobre la aritmética de coma flotante se explica detalladamente sobre los problemas que rodean a los números de coma flotante .
Este article titulado "IEEE Standard 754 Floating Point Numbers" puede ser útil. Para ser sincero, no estoy completamente seguro de entender su pregunta, así que no estoy seguro de que esto sea útil, pero espero que así sea.
Lo que recuerdo es que un punto flotante de 32 bits se almacena utilizando 24 bits para un número real, y los 8 bits restantes se usan como una potencia de 10, determinando dónde está el punto decimal.
Estoy un poco oxidado sobre el tema aunque ...
Sí, existe el estándar IEEE para la aritmética de coma flotante binaria (IEEE 754)
El número se divide en tres partes, signo, exponente y fracción, cuando se almacena en formato binario.
Si realmente le preocupan los errores de coma flotante, la mayoría de los idiomas ofrecen tipos de datos que no tienen errores de coma flotante. SQL Server tiene los tipos de datos Decimal y Money. .Net tiene el tipo de datos Decimal. No tienen una precisión infinita como BigDecimal en Java, pero son precisos hasta el número de decimales para el que están definidos. Así que no tiene que preocuparse por un valor en dólares que ingrese como $ 4.58 que se guarda como un valor de punto flotante de 4.579999999999997