2008-09-11 15 views
32

En seguimiento hasta this question, parece que algunos números no se pueden representar por coma flotante en absoluto, y en su lugar son aproximados.¿Cómo se almacena el punto flotante? ¿Cuándo importa?

¿Cómo se almacenan los números de coma flotante?

¿Existe un estándar común para los diferentes tamaños?

¿De qué tipo de trampas debo tener cuidado si uso el punto flotante?

¿Son compatibles entre idiomas (es decir, qué conversiones necesito para enviar un número de punto flotante desde un programa python a un programa C sobre TCP/IP)?

-Adán

Respuesta

22

Como se mencionó, el Wikipedia article on IEEE 754 hace un buen trabajo para mostrar cómo se almacenan los números de coma flotante en la mayoría de los sistemas.

Ahora, aquí hay algunos errores comunes:

  • El más grande es que casi nunca quiere 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 pueden ser 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, usted no será capaz de añadir 1e30 a 1e30.)
0

Lo que recuerdo es un punto flotante de 32 bits se almacena utilizando 24 bits para un número real, y el permanecer 8 bits se utilizan como una potencia de 10, la determinación de dónde el punto decimal es.

estoy un poco oxidado en el tema ... aunque

5

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 Java BigDecimal 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.

2

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.

3

Básicamente, lo que necesita preocuparse en números de coma flotante 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 general 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.

5

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 coma flotante como una cadena sobre TCP/IP. Esto le permite evitar problemas como la alineación de bytes y facilitará la depuración.

1

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. Entonces, no tiene que preocuparse por un valor en dólares que ingrese como $ 4.58 guardando como un valor de coma flotante de 4.579999999999997

3

En seguimiento a esta pregunta, parece que algunos números no pueden ser representada por el punto flotante en absoluto, y en su lugar son aproximados.

Correcto.

¿Cómo se almacenan los números en coma flotante? ¿Existe un estándar común para los diferentes tamaños?

Como los otros carteles ya mencionados, casi exclusivamente IEEE754 y su sucesor IEEE754R. Buscar en Google te da mil explicaciones junto con patrones de bits y su explicación. Si aún tiene problemas para obtenerlo, hay dos formatos FP aún comunes: IBM y DEC-VAX. Para algunas máquinas esotéricas y compiladores (BlitzBasic, TurboPascal) hay algunos formatos impares .

¿De qué tipo de cosas tengo que tener cuidado si uso el punto flotante? ¿Son compatibles con varios idiomas (es decir, qué conversiones necesito para tratar con para enviar un número de coma flotante de un programa python a un programa C sobre TCP/IP)?

Prácticamente ninguno, son compatibles a través del lenguaje.

peculiaridades occuring Muy raras:

  • IEEE754 define sNaNs (señalización NaNs) y los QNAN (tranquilo NANS). 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. Así que no confíe en una conversión bruta 1: 1. Pero nuevamente: esto es muy raro y ocurre solo si están presentes NaNs .

  • Puede tener problemas con la endianidad (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.

Cuestiones relacionadas