stringtranslate.com

Precisión extendida

La precisión extendida se refiere a formatos de números de punto flotante que brindan mayor precisión que los formatos básicos de punto flotante. [1] Los formatos de precisión extendida admiten un formato básico al minimizar los errores de redondeo y desbordamiento en valores intermedios de expresiones en el formato base. A diferencia de la precisión extendida , la aritmética de precisión arbitraria se refiere a implementaciones de tipos numéricos mucho más grandes (con un recuento de almacenamiento que generalmente no es una potencia de dos) utilizando software especial (o, raramente, hardware).

Implementaciones de precisión extendida

Existe una larga historia de formatos extendidos de punto flotante que se remonta casi a mediados del siglo pasado. Varios fabricantes han utilizado diferentes formatos para mayor precisión para diferentes máquinas. En muchos casos, el formato de precisión extendida no es exactamente lo mismo que una ampliación de los formatos ordinarios de precisión simple y doble que se pretende ampliar. En unos pocos casos, la implementación fue simplemente un cambio basado en software en el formato de datos de punto flotante, pero en la mayoría de los casos, la precisión extendida se implementó en hardware, ya sea integrado en el propio procesador central o, más a menudo, integrado en el hardware de una computadora. Procesador adjunto opcional llamado " unidad de punto flotante " (FPU) o "procesador de punto flotante" ( FPP ), accesible a la CPU como un dispositivo rápido de entrada/salida.

Formatos de precisión extendida de IBM

El IBM 1130 , vendido en 1965, [2] ofrecía dos formatos de punto flotante: un formato de "precisión estándar" de 32 bits y un formato de "precisión extendida" de 40 bits. El formato de precisión estándar contiene un significado en complemento a dos de 24 bits , mientras que la precisión extendida utiliza un significado en complemento a dos de 32 bits. El último formato aprovecha al máximo las operaciones enteras de 32 bits de la CPU. La característica en ambos formatos es un campo de 8 bits que contiene la potencia de dos sesgada por 128. Las operaciones aritméticas de punto flotante se realizan mediante software y no se admite en absoluto la doble precisión . El formato extendido ocupa tres palabras de 16 bits y el espacio extra simplemente se ignora. [3]

IBM System/360 admite un formato de punto flotante "corto" de 32 bits y un formato de punto flotante "largo" de 64 bits. [4] El 360/85 y el siguiente System/370 agregan soporte para un formato "extendido" de 128 bits. [5] Estos formatos todavía son compatibles con el diseño actual , donde ahora se denominan formatos de " punto flotante hexadecimal " (HFP).

Formato de precisión extendida Microsoft MBF

El puerto Microsoft BASIC para la CPU 6502 , como en adaptaciones como Commodore BASIC , AppleSoft BASIC , KIM-1 BASIC o MicroTAN BASIC, admite una variante extendida de 40 bits del formato de punto flotante Microsoft Binary Format (MBF) desde 1977. [6]

Formatos de precisión extendida IEEE 754

El estándar de punto flotante IEEE 754 recomienda que las implementaciones proporcionen formatos de precisión extendida. El estándar especifica los requisitos mínimos para un formato extendido pero no especifica una codificación. [7] La ​​codificación es elección del implementador. [8]

Los procesadores IA32 , x86-64 e Itanium admiten lo que es, con mucho, el formato más influyente en este estándar, el formato "doble extendido" Intel de 80 bits (64 bits), que se describe en la siguiente sección.

Los coprocesadores matemáticos Motorola 6888x y los procesadores Motorola 68040 y 68060 admiten este mismo tipo de precisión extendida significativa de 64 bits (similar al formato Intel aunque rellenado a un formato de 96 bits con 16 bits no utilizados insertados entre los campos exponente y significativo [9] ). Los siguientes procesadores Coldfire no admiten este formato de precisión extendida de 96 bits. [10]

El coprocesador matemático FPA10 para los primeros procesadores ARM también admite este tipo de precisión extendida (similar al formato Intel aunque rellenado a un formato de 96 bits con 16 bits cero insertados entre los campos de signo y exponente), pero sin redondeo correcto. [11]

Los formatos x87 y Motorola 68881 de 80 bits cumplen con los requisitos del formato extendido IEEE 754, [12] al igual que el formato IEEE 754 de 128 bits .

formato de precisión extendida x86

El formato de precisión extendida x86 es un formato de 80 bits implementado por primera vez en el coprocesador matemático Intel 8087 y es compatible con todos los procesadores basados ​​en el diseño x86 que incorporan una unidad de punto flotante (FPU).

El Intel 8087 fue el primer dispositivo x86 que admitía aritmética de punto flotante en hardware. Fue diseñado para admitir un formato de "precisión simple" de 32 bits y un formato de "precisión doble" de 64 bits para codificar e intercambiar números de punto flotante. El formato extendido fue diseñado no para almacenar datos con mayor precisión, sino más bien para permitir el cálculo de resultados dobles temporales de manera más confiable y precisa al minimizar el desbordamiento y los errores de redondeo en los cálculos intermedios. [a] [14] [15] Todos los registros de punto flotante en el 8087 mantienen este formato, y convierte automáticamente los números a este formato cuando carga registros desde la memoria y también convierte los resultados a formatos más convencionales cuando vuelve a almacenar los registros. en la memoria. Para permitir que los resultados de subexpresiones intermedias se guarden en variables reutilizables de precisión extendida y continúen en declaraciones del lenguaje de programación, y que los cálculos interrumpidos se reanuden donde fueron interrumpidos, proporciona instrucciones que transfieren valores entre estos registros internos y la memoria sin realizar ninguna conversión, lo que por lo tanto permite el acceso al formato extendido para los cálculos [b] – reviviendo también la cuestión de la exactitud de las funciones de dichos números, pero con mayor precisión.

Las unidades de punto flotante (FPU) de todos los procesadores x86 posteriores han admitido este formato. Como resultado, se puede desarrollar software que aproveche la mayor precisión que proporciona este formato. William Kahan , uno de los principales diseñadores de la aritmética x87 y de la propuesta inicial del estándar IEEE 754, comenta sobre el desarrollo del punto flotante x87: "Se incluyó un formato extendido tan ancho como nos atrevimos (80 bits) para cumplir la misma función de soporte que el 13 El formato interno decimal sirve en las calculadoras de 10 decimales de Hewlett-Packard." [17] Además, Kahan señala que 64 bits era el significado más amplio a través del cual se podía realizar la propagación del acarreo sin aumentar el tiempo de ciclo en el 8087, [18] y que la precisión extendida x87 fue diseñada para ser extensible a una mayor precisión en procesadores futuros. : "Por ahora, el formato extendido de 10 bytes es un compromiso tolerable entre el valor de la aritmética extraprecisa y el precio de implementarla para ejecutarla rápidamente; muy pronto dos bytes más de precisión serán tolerables y, en última instancia, un formato de 16 bytes . ... Ese tipo de evolución gradual hacia una mayor precisión ya estaba a la vista cuando se elaboró ​​el Estándar IEEE 754 para Aritmética de Punto Flotante ." [19]

Este formato de 80 bits utiliza un bit para el signo del significado, 15 bits para el campo exponente (es decir, el mismo rango que el formato IEEE 754 de precisión cuádruple de 128 bits ) y 64 bits para el significado. El campo de exponente está sesgado por 16383, lo que significa que se debe restar 16383 del valor en el campo de exponente para calcular la potencia real de 2. [20] Se reserva un valor de campo de exponente de 32767 (los quince bits 1 ) para permitir la representación de estados especiales como infinito y No es un número . Si el campo del exponente es cero, el valor es un número anormal y el exponente de 2 es −16382. [21]

En la siguiente tabla, " s " es el valor del bit de signo (0 significa positivo, 1 significa negativo), " e " es el valor del campo exponente interpretado como un entero positivo y " m " es el significado interpretado como un número binario positivo donde el punto binario se encuentra entre los bits 63 y 62. El campo " m " es la combinación de las partes entera y fraccionaria en el diagrama anterior.

A diferencia de los formatos de precisión simple y doble , este formato no utiliza un bit implícito/oculto . Más bien, el bit 63 contiene la parte entera del significado y los bits 62-0 contienen la parte fraccionaria. El bit 63 será 1 en todos los números normalizados. Este diseño tenía varias ventajas cuando se estaba desarrollando el 8087 :

Introducción al uso

El formato de punto flotante de 80 bits estaba ampliamente disponible en 1984, [25] después del desarrollo de C, Fortran y lenguajes informáticos similares, que inicialmente ofrecían sólo los tamaños comunes de punto flotante de 32 y 64 bits. En el diseño x86, la mayoría de los compiladores de C ahora admiten precisión extendida de 80 bits a través del tipo long double , y esto se especificó en los estándares C99 / C11 (IEC 60559 aritmética de punto flotante (Anexo F)). Los compiladores en x86 para otros lenguajes a menudo también admiten precisión extendida, a veces a través de extensiones no estándar: por ejemplo, Turbo Pascal ofrece un Extendedtipo y varios compiladores de FortranREAL*10 tienen un tipo (análogo a REAL*4y REAL*8). Estos compiladores también suelen incluir subrutinas matemáticas de precisión extendida , como raíces cuadradas y funciones trigonométricas , en sus bibliotecas estándar .

Rango de trabajo

El formato de punto flotante de 80 bits tiene un rango (incluidos los subnormales ) de aproximadamente 3,65 × 10 −4951 a 1,18 × 10 4932 . Aunque log 10 (2 64 ) ≅ 19,266, este formato generalmente se describe como que proporciona aproximadamente dieciocho dígitos significativos de precisión (el piso de log 10 (2 63 ), la precisión mínima garantizada). El uso de decimal cuando se habla de binario es desafortunado porque la mayoría de las fracciones decimales son secuencias recurrentes en binario, al igual que 2/3 lo es en decimal. Por lo tanto, un valor como 10,15 se representa en binario como equivalente a 10,1499996185, etc. en decimal para REAL*4 pero 10,15000000000000035527etc. en REAL*8: la interconversión implicará una aproximación, excepto para aquellas pocas fracciones decimales que representan un valor binario exacto, como 0,625. Para REAL*10, la cadena decimal es 10.14999999999999999996530553etc. Los últimos nueve dígitos son el decimoctavo dígito fraccionario y, por tanto, el vigésimo dígito significativo de la cadena. Los límites de conversión entre decimal y binario para el formato de 80 bits se pueden dar de la siguiente manera: si una cadena decimal con como máximo 18 dígitos significativos se redondea correctamente a un valor de punto flotante binario IEEE 754 de 80 bits (como en la entrada), entonces convertida nuevamente al mismo número de dígitos decimales significativos (como para la salida), entonces la cadena final coincidirá exactamente con la original; mientras que, a la inversa, si un valor de punto flotante binario IEEE 754 de 80 bits se convierte correctamente y (más cercano) se redondea a una cadena decimal con al menos 21 dígitos decimales significativos y luego se vuelve a convertir al formato binario, coincidirá exactamente con el original. [12] Estas aproximaciones son particularmente problemáticas cuando se especifica el mejor valor para constantes en fórmulas con alta precisión, como podría calcularse mediante aritmética de precisión arbitraria .

Necesidad del formato de 80 bits

Un ejemplo notable de la necesidad de un mínimo de 64 bits de precisión en el significado del formato de precisión extendida es la necesidad de evitar la pérdida de precisión al realizar la exponenciación en valores de doble precisión . [26] [27] [28] [c] Las unidades de punto flotante x86 no proporcionan una instrucción que realice directamente la exponenciación . En lugar de eso, proporcionan un conjunto de instrucciones que un programa puede usar en secuencia para realizar la exponenciación usando la ecuación:

Para evitar la pérdida de precisión, los resultados intermedios " log 2 ( x ) " e " y ·log 2 ( x ) " deben calcularse con una precisión mucho mayor, porque efectivamente tanto el campo exponente como el campo significativo de x deben encajar en el campo significativo del resultado intermedio. Posteriormente, el campo significativo del resultado intermedio se divide entre los campos exponente y significativo del resultado final cuando se calculan 2 resultados intermedios . La siguiente discusión describe este requisito con más detalle.

Con un poco de desempaque, un valor de doble precisión IEEE 754 se puede representar como:

donde s es el signo del exponente (0 o 1), E es el exponente insesgado, que es un número entero que oscila entre 0 y 1023, y M es el significado, que es un valor de 53 bits que se encuentra en el rango 1. ≤ METRO < 2 . Los números negativos y el cero se pueden ignorar porque el logaritmo de estos valores no está definido. Para los propósitos de esta discusión, M no tiene 53 bits de precisión porque está obligado a ser mayor o igual a uno, es decir, el bit oculto no cuenta para la precisión (tenga en cuenta que en situaciones en las que M es menor que 1, el valor es en realidad es una anormalidad y, por lo tanto, es posible que ya haya sufrido una pérdida de precisión. Esta situación está más allá del alcance de este artículo).

Tomando el registro de esta representación de un número de doble precisión y simplificando se obtiene lo siguiente:

Este resultado demuestra que cuando se toma el logaritmo de base 2 de un número, el signo del exponente del valor original se convierte en el signo del logaritmo, el exponente del valor original se convierte en la parte entera del significado del logaritmo y el significado de el valor original se transforma en la parte fraccionaria del significado del logaritmo.

Debido a que E es un número entero en el rango de 0 a 1023, se necesitan hasta 10 bits a la izquierda del punto de la base para representar la parte entera del logaritmo. Debido a que M cae en el rango 1 ≤ M < 2 , el valor de log 2 M caerá en el rango 0 ≤ log 2 M < 1 , por lo que se necesitan al menos 52 bits a la derecha del punto de la base para representar la parte fraccionaria de el logaritmo. Combinar 10 bits a la izquierda del punto de la base con 52 bits a la derecha del punto de la base significa que la parte significativa del logaritmo debe calcularse con al menos 62 bits de precisión. En la práctica, los valores de M menores que requieren 53 bits a la derecha del punto de base y los valores de M menores que requieren 54 bits a la derecha del punto de base para evitar la pérdida de precisión. Para equilibrar este requisito de mayor precisión a la derecha del punto de la base, los exponentes menores a 512 solo requieren 9 bits a la izquierda del punto de la base y los exponentes menores a 256 requieren solo 8 bits a la izquierda del punto de la base.

La parte final del cálculo de la exponenciación es calcular 2 resultados intermedios . El "resultado intermedio" consta de una parte entera " I " sumada a una parte fraccionaria " F ". Si el resultado intermedio es negativo, entonces se necesita un ligero ajuste para obtener una parte fraccionaria positiva porque tanto " I " como " F " son números negativos.

Para resultados intermedios positivos:

Para resultados intermedios negativos:

Así, la parte entera del resultado intermedio (" I " o " I −1 ") más un sesgo se convierte en el exponente del resultado final y la parte fraccionaria positiva transformada del resultado intermedio: 2 F o 2 1+ F se convierte en el significado de el resultado final. Para proporcionar 52 bits de precisión al resultado final, la parte fraccionaria positiva debe mantenerse en al menos 52 bits.

En conclusión, el número exacto de bits de precisión necesarios en el significado del resultado intermedio depende en cierta medida de los datos, pero 64 bits son suficientes para evitar la pérdida de precisión en la gran mayoría de los cálculos de exponenciación que involucran números de doble precisión .

El número de bits necesarios para el exponente del formato de precisión extendida se deriva del requisito de que el producto de dos números de doble precisión no se desborde cuando se calcula utilizando el formato extendido. El mayor exponente posible de un valor de doble precisión es 1023, por lo que el exponente del mayor producto posible de dos números de doble precisión es 2047 (un valor de 11 bits). Agregar un sesgo para tener en cuenta los exponentes negativos significa que el campo del exponente debe tener al menos 12 bits de ancho.

Combinando estos requisitos: 1 bit para el signo, 12 bits para el exponente sesgado y 64 bits para el significado significa que el formato de precisión extendida necesitaría al menos 77 bits. Las consideraciones de ingeniería dieron como resultado la definición final del formato de 80 bits (en particular, el estándar IEEE 754 requiere que el rango de exponentes de un formato de precisión extendida coincida con el del siguiente formato de precisión cuádruple más grande , que es de 15 bits). [27]

Otro ejemplo de cálculos que se benefician de la aritmética de precisión extendida son los esquemas de refinamiento iterativo , que se utilizan para limpiar indirectamente los errores acumulados en la solución directa durante la normalmente gran cantidad de cálculos realizados para el álgebra lineal numérica. [30]

Ayuda de idioma

Ver también

Notas a pie de página

  1. ^ "Este formato está destinado principalmente a ayudar a los programadores a mejorar la integridad de su software simple y doble, y a atenuar la degradación por redondeo en cálculos de matriz doble de dimensiones más grandes, y puede usarse fácilmente de tal manera que se sustituya cuádruple por extendido Nunca es necesario invalidar su uso." — diseñador de x87 W. Kahan [13]
  2. ^ "Los lenguajes de alto nivel utilizarán extendido (de forma invisible) para evaluar subexpresiones intermedias y luego pueden proporcionar extendido como un tipo de datos declarable". [16] : 70 
  3. ^ "La presencia de al menos tantos bits adicionales de precisión en el campo extendido como en el exponente del formato básico que admite simplifica enormemente el cálculo preciso de las funciones trascendentales, los productos internos y la función de potencia y x ". [29] : 70 

Referencias

  1. ^ IEEE 754 (2008, ¶ 2.1.21) define el formato de precisión extendida como "Un formato que amplía un formato básico compatible proporcionando una precisión y un rango más amplios".
  2. ^ Francis, CG (11 de febrero de 1965). "IBM presenta una computadora pequeña y potente". Director de Información (Nota de prensa). White Plains, Nueva York : Corporación Internacional de Máquinas de Negocios (IBM). Archivado desde el original el 5 de julio de 2019.
  3. ^ Biblioteca de subrutinas (PDF) . IBM 1130 (9ª ed.). Corporación IBM. 1974. pág. 93.
  4. ^ Principios de funcionamiento . IBM System/360 (9ª ed.). Corporación IBM. 1970. pág. 41.
  5. ^ Principios de funcionamiento de IBM System/370 (7ª ed.). Corporación IBM. 1980. págs. 9-2–9-3.
  6. ^ Steil, Michael (20 de octubre de 2008). "Crea tu propia versión de Microsoft BASIC para 6502". pagetable.com . pag. 46. ​​Archivado desde el original el 30 de mayo de 2016 . Consultado el 30 de mayo de 2016 .
  7. ^ IEEE Computer Society (29 de agosto de 2008). Estándar IEEE para aritmética de coma flotante (Reporte). IEEE. §3.7. doi :10.1109/IEEESTD.2008.4610935. ISBN 978-0-7381-5752-8. Norma IEEE 754-2008.
  8. ^ Cervecero, Kevin. "Informe de Kevin". Material de referencia IEEE-754 . Consultado el 19 de febrero de 2012 .
  9. ^ Familia Motorola MC68000 (PDF) . Manual de referencia para programadores. Semiconductores de escala libre. 1992, págs. 1-16.
  10. ^ Familia ColdFire (PDF) . Manual de referencia para programadores. Semiconductor de escala libre. 2005. pág. 7-7.
  11. ^ "Hoja de datos de FPA10" (PDF) . chrisacorns.computinghistory.org.uk . Semiconductores GEC Plessey. 11 de junio de 1993 . Consultado el 26 de noviembre de 2020 .
  12. ^ ab Kahan, William (1 de octubre de 1997). "Apuntes de conferencias sobre el estado del estándar IEEE 754 para aritmética binaria de punto flotante" (PDF) .
  13. ^ Kahan, William (1 de octubre de 1997). "Apuntes de conferencias sobre el estado del estándar IEEE 754 para aritmética binaria de punto flotante" (PDF) . pag. 5.
  14. ^ Einarsson, Bo (2005). Precisión y confiabilidad en la computación científica. SIAM. págs.9 y siguientes. ISBN 978-0-89871-815-7. Consultado el 3 de mayo de 2013 .
  15. ^ "Arquitecturas Intel 64 e IA-32". Manual del desarrollador de software. Intel Corp. Marzo de 2012. §8.2.
  16. ^ Coonen, Jerome T. (enero de 1980). "Una guía de implementación de un estándar propuesto para aritmética de punto flotante". Computadora IEEE . 13 : 68–79. doi :10.1109/MC.1980.1653344. S2CID  206445847.
  17. ^ Kahan, William (22 de noviembre de 1983). "Matemáticas escritas en arena: hp-15C, Intel 8087, etc." (PDF) .
  18. ^ Goldberg, David (marzo de 1991). "Lo que todo informático debería saber sobre la aritmética de punto flotante" (PDF) . Encuestas de Computación ACM . 23 (1): 192. doi : 10.1145/103162.103163. S2CID  222008826.
  19. ^ Higham, Nicolás (2002). "Diseño de algoritmos estables". Precisión y estabilidad de algoritmos numéricos (2 ed.). Sociedad de Matemática Industrial y Aplicada (SIAM). pag. 43.
  20. ^ Hoja de datos Intel 80C187
  21. ^ Manual del desarrollador de arquitecturas Intel 64 e IA-32: vol. 1. Corporación Intel. Págs. 4-6 a 4-9 y 4-18 a 4-21.
  22. ^ Palmer, John F.; Morse, Stephen P. (1984). La cartilla 8087. Prensa Wiley. págs.14. ISBN 0-471-87569-4.
  23. ^ Morse, Stephen P.; Albert, Douglas J. (1986). La Arquitectura 80286 . Prensa Wiley. págs. 91-111. ISBN 0-471-83185-9.
  24. ^ Manual del desarrollador de arquitecturas Intel 64 e IA-32: vol. 1. Corporación Intel. págs. 8-21 a 8-22.
  25. ^ Charles Severance (20 de febrero de 1998). "Una entrevista con el viejo del punto flotante".
  26. ^ Palmer, John F.; Morse, Stephen P. (1984). La cartilla 8087. Prensa Wiley. págs.16. ISBN 0-471-87569-4.
  27. ^ ab Morse, Stephen P.; Albert, Douglas J. (1986). La Arquitectura 80286 . Prensa Wiley. págs. 96–98. ISBN 0-471-83185-9.
  28. ^ Hough, David (marzo de 1981). "Aplicaciones del estándar IEEE 754 propuesto para aritmética de punto flotante". Computadora IEEE . 14 (3): 70–74. doi :10.1109/CM.1981.220381. S2CID  14645749.
  29. ^ Coonen, Jerome T. (enero de 1980). "Una guía de implementación de un estándar propuesto para aritmética de punto flotante". Computadora IEEE : 68–79. doi :10.1109/MC.1980.1653344. S2CID  206445847.
  30. ^ Demmel, James; Hida, Yozo; Kahan, William ; Li, Xiaoye S .; Mukherjee, Sonil; Riedy, E. Jason (junio de 2006). "Límites de error debidos al refinamiento iterativo extrapreciso" (PDF) . Transacciones ACM sobre software matemático . 32 (2): 325–351. doi :10.1145/1141885.1141894. S2CID  1340891 . Consultado el 18 de abril de 2014 .
  31. ^ "Tipos flotantes (utilizando la colección de compiladores GNU (GCC))".
  32. ^ "El tipo de datos extendido es diferente en diferentes plataformas".