Pregunta

En el seguimiento de esta pregunta, parece que algunos números no pueden ser representados por punto flotante en todo, y en cambio se aproxima.

¿Cómo son los números de punto flotante almacenados?

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

¿Qué tipo de artimañas necesito para ver si puedo usar de punto flotante?

Son el lenguaje de la cruz es compatible (es decir, lo que las conversiones necesito para hacer frente a enviar un número de punto flotante de un programa en python para un programa en C a través de TCP/IP)?

-Adam

¿Fue útil?

Solución

Como se ha mencionado, la Artículo de Wikipedia sobre el estándar IEEE 754 hace un buen trabajo de mostrar cómo los números de punto flotante se almacenan en la mayoría de los sistemas.

Ahora, aquí hay algunos errores comunes:

  • La más grande es que casi nunca se quieren comparar dos números de punto flotante para la igualdad (o desigualdad).Usted querrá usar mayor que/menor que las comparaciones de lugar.
  • Las más de las operaciones que realice en un número de punto flotante, el más significativo de los errores de redondeo puede llegar a ser.
  • La precisión es limitada por el tamaño de la fracción, así que usted puede no ser capaz de agregar correctamente los números que están separados por varios órdenes de magnitud.(Por ejemplo, usted no será capaz de añadir 1E-30 a 1E30.)

Otros consejos

Una explicación detallada de los problemas que rodean a los números de punto flotante se da en el artículo Lo Que Cada Equipo Científico Debe Saber Sobre La Aritmética De Punto Flotante.

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 también a SQL del tipo de número.Se pueden utilizar símbolos para los números irracionales, y las relaciones que pueden no ser exactamente representado en binario o decimal de punto flotante puede ser almacenado como una relación.

En cuanto a la segunda parte de tu pregunta, a menos que el rendimiento y la eficiencia son importantes para su proyecto, entonces le sugiero que la transferencia de los datos de punto flotante como una cadena a través de TCP/IP.Esto le permite evitar problemas tales como la alineación de bytes y facilitar la depuración.

Básicamente lo que usted necesita preocuparse acerca de los números de punto flotante es que hay un número limitado de dígitos de precisión.Esto puede causar problemas cuando se prueba por la igualdad, o si el programa necesita más dígitos de precisión que lo que el tipo de datos de dar.

En C++, una buena regla del pulgar es pensar que un float le da 7 dígitos de precisión, mientras que un doble le da 15.También, si usted está interesado en saber cómo comprobar la igualdad, se puede ver en este la pregunta del hilo.

En seguimiento a esta pregunta, es parece que algunos números no se puede representado por punto flotante en todo, y en cambio se aproxima.

Correcto.

¿Cómo son los números de punto flotante almacenados?Hay un estándar común para los diferentes tamaños?

Como los otros carteles ya se ha mencionado, casi exclusivamente IEEE754 y su sucesor IEEE754R.Google le da mil explicaciones, junto con patrones de bits y su explicación.Si usted todavía tiene problemas para conseguirlo, hay dos todavía común de FP formatos:IBM y DEC-VAX.Para algunos esotéricos máquinas y compiladores (BlitzBasic, TurboPascal) hay algunos extraño formatos.

¿Qué tipo de artimañas necesito para ver si puedo usar de punto flotante?Son el lenguaje de la cruz es compatible (es decir, lo que las conversiones necesito para hacer frente a enviar un número de punto flotante de un programa en python para un programa en C a través de TCP/IP)?

Prácticamente ninguno, son el lenguaje de la cruz compatible.

Muy raras que ocurren peculiaridades:

  • IEEE754 define sNaNs (señalización Nan) y qNaNs (tranquilo Nan).El ex queridos a causa de una trampa, la cual obliga a que el procesador para llamar a una rutina de controlador si se carga.Estos últimos no hacen esto.Debido a que los diseñadores de lenguajes odiaba la posibilidad de que sNaNs interrumpir su flujo de trabajo y el apoyo a ellos cumplir soporte para controlador de rutinas, sNaNs son casi siempre en silencio convertido en qNaNs.Así que no confíe en un 1:1 de conversión de raw.Pero, de nuevo:Esto es muy raro y sólo se produce si Nan están presentes.

  • Usted puede tener problemas con el peso (los bytes están en el orden equivocado) si los archivos entre diferentes equipos son compartidos.Es fácilmente detectable porque está consiguiendo Nan para los números.

Sí existe la El Estándar de IEEE para Aritmética Binaria de coma Flotante (IEEE 754)

El número está dividido en tres partes, el signo, el exponente y fracción, cuando se almacena en binario.

Este artículo titulado "el Estándar IEEE 754 de Números de Punto Flotante" puede ser útil.Para ser honesto, no estoy completamente seguro de que voy a entender tu pregunta, así que no estoy seguro de que esto va a ser útil, pero tengo la esperanza de que va a ser.

Si usted está realmente preocupado acerca de punto flotante de errores de redondeo, la mayoría de los idiomas ofrecen tipos de datos que no tienen errores de punto flotante.SQL Server tiene el Decimal y de Dinero tipos de datos..Net tiene el tipo de datos Decimal.Ellos no son de precisión infinita como BigDecimal en Java, pero son precisos hasta el número de posiciones decimales que se definen para.Así que usted no tiene que preocuparse acerca de un dólar de valor que escriba en como $4.58 llegar guardado como un valor de punto flotante de 4.579999999999997

Lo que yo recuerdo es una versión de 32 bits de punto flotante se almacenan con 24 bits de un número real, y el permanecer de 8 bits se utilizan como una potencia de 10, determinar dónde se encuentra el punto decimal es.

Estoy un poco oxidado en el tema tho...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top