¿Cuáles son las aplicaciones / beneficios de un tipo de datos de precisión extendida de 80 bits?

StackOverflow https://stackoverflow.com/questions/612507

  •  03-07-2019
  •  | 
  •  

Pregunta

Sí, quería decir 80 bits . Eso no es un error tipográfico ...

Mi experiencia con variables de punto flotante siempre ha involucrado múltiplos de 4 bytes, como singles (32 bits), dobles (64 bits) y dobles largos (que he visto referidos como 96 bits o 128 bits ). Por eso me confundí un poco cuando me topé con un tipo de datos de precisión extendida de 80 bits mientras estaba trabajando en un código para leer y escribir en AIFF (Formato de archivo de intercambio de audio) archivos : un extenso Se eligió la variable de precisión para almacenar la frecuencia de muestreo de la pista de audio.

Cuando hojeé Wikipedia, encontré el enlace anterior junto con una breve mención de los formatos de 80 bits en IEEE 754-1985 standard resumen (pero no en el IEEE 754-2008 standard resumen). Parece que en ciertas arquitecturas " ampliado " y " doble largo " son sinónimos.

Una cosa que no he encontrado son las aplicaciones específicas que utilizan tipos de datos de precisión extendida (excepto, por supuesto, las tasas de muestreo de archivos AIFF). Esto me llevó a preguntarme:

  • ¿Alguien se ha topado con una situación en la que la precisión extendida fuera necesaria / beneficiosa para algunas aplicaciones de programación?
  • ¿Cuáles son los beneficios de un número de punto flotante de 80 bits, aparte del obvio " es un poco más de precisión que un doble pero menos bytes que la mayoría de las implementaciones de un doble 'quot ;?
  • ¿Está disminuyendo su aplicabilidad?
¿Fue útil?

Solución

Las FPU de Intel utilizan el formato de 80 bits internamente para obtener más precisión en resultados intermedios.

Es decir, es posible que tenga variables de 32 o 64 bits, pero cuando se cargan en los registros de FPU, se convierten a 80 bits; la FPU entonces (por defecto) realiza todos los cálculos en 80 pero; después del cálculo, el resultado se almacena de nuevo en variables de 32 bits o de 64 bits.

Por cierto: una consecuencia un tanto desafortunada de esto es que las compilaciones de depuración y liberación pueden producir resultados ligeramente diferentes: en la compilación de la versión, el optimizador puede mantener una variable intermedia en un registro FPU de 80 bits, mientras que en la compilación de depuración, será almacenado en una variable de 64 bits, causando pérdida de precisión. Puede evitar esto utilizando variables de 80 bits, o use un conmutador FPU (o opción de compilador) para realizar todos los cálculos en 64 bits.

Otros consejos

Para mi el uso de 80 bits es ESENCIAL. De esta manera, obtengo valores propios de alto orden (30,000) y vectores propios de matrices simétricas con cuatro figuras más cuando utilizo la biblioteca GOTO para productos interiores vectoriales, es decir, 13 en lugar de 9 figuras significativas para el tipo de matrices que utilizo en atómica relativista Cálculos, que son necesarios para evitar caer en el mar de estados de energía negativa. Mi otra opción es usar aritmética de precisión cuádruple que aumenta el tiempo de CPU 60-70 veces y también aumenta los requisitos de RAM. Cualquier cálculo basado en productos internos de grandes vectores se beneficiará. Por supuesto, para mantener los resultados parciales del producto interno dentro de los registros, es necesario usar un lenguaje de ensamblador, como en las bibliotecas GOTO. Así es como llegué a amar a mis viejos procesadores Opteron 850, que usaré mientras duren para esa parte de mis cálculos.

La razón por la que 80 bits es rápido, mientras que una mayor precisión es mucho más lenta, es que el hardware de punto flotante estándar de la CPU tiene registros de 80 bits. Por lo tanto, si desea 16 bits adicionales (11 bits adicionales de mantisa, cuatro bits adicionales de exponente y un bit adicional sin usar), entonces realmente no le cuesta mucho extenderlo de 64 a 80 bits, mientras que extender Más allá de 80 bits es extremadamente costoso en términos de tiempo de ejecución. Por lo tanto, también puede utilizar la precisión de 80 bits si lo desea. Su uso no es gratuito, pero es bastante barato.

Wikipedia explica que un formato de 80 bits puede representar un entero entero de 64 bits sin perder información. Por lo tanto, la unidad de punto flotante de la CPU se puede usar para implementar la multiplicación y la división de enteros.

Otra ventaja que aún no se menciona para los tipos de 80 bits es que en los procesadores de 16 bits o de 32 bits que no tienen unidades de punto flotante pero tienen una " multiplica " instrucción que produce un resultado dos veces más largo que los operandos (16x16- > 32 o 32x32- > 64), aritmética en una mantisa de 64 bits subdividida en cuatro o dos registros de 16 bits o 32 bits será más rápida que la aritmética en una mantisa de 53 bits que abarca el mismo número de registros pero tiene que compartir 12 bits de registro con el signo y el exponente. Para las aplicaciones que no necesitan nada más preciso que float , los cálculos en un " float extendido " de 48 bits " el tipo también podría ser más rápido que los cálculos en un float de 32 bits.

Si bien algunas personas pueden lamentar el comportamiento de doble redondeo de los tipos de precisión extendida, en realidad solo se trata de un problema en aplicaciones especializadas que requieren una reproducibilidad multiplataforma completa de bits exactos. Desde el punto de vista de precisión , la diferencia entre un error de redondeo de 64/128 vs 65/128, o 1024 / 2048ulp vs 1025/2048, no es un problema; en idiomas con tipos de variables de precisión extendida y semántica consistente de precisión extendida , el uso de tipos extendidos en muchas plataformas sin hardware de punto flotante (por ejemplo, sistemas integrados) ofrecerá ambos Precisión y mejor velocidad que los tipos de punto flotante de precisión simple o doble.

Utilicé 80 bits para algunas investigaciones de matemáticas puras. Tuve que sumar términos en una serie infinita que creció bastante grande, fuera del rango de los dobles. La convergencia y la precisión no eran preocupaciones, solo la capacidad de manejar grandes exponentes como 1E1000. Tal vez algún álgebra inteligente podría haber simplificado las cosas, pero era mucho más rápido y fácil simplemente codificar un algoritmo con una precisión extendida, que pasar un tiempo pensando en ello.

Tengo un amigo que está trabajando en eso. Está trabajando en una biblioteca para manejar puntos flotantes del tamaño de gigabytes. Por supuesto, es algo relacionado con la computación científica (cálculos con plasma), y probablemente solo este tipo de computación funciona con números tan grandes ...

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