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, rara vez, hardware).
Hay una larga historia de formatos extendidos de punto flotante que se remonta casi a mediados del siglo pasado [ ¿cuándo? ] . 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.
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 adicional 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).
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]
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 también admiten un formato 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, y los valores con exponente cero y bit 63 uno son valores normalizados [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 un formato de precisión extendida significativa de 64 bits (similar al formato Intel aunque acolchado 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 doble extendido IEEE 754-1985, [12] al igual que el formato binario IEEE 754 de 128 bits .
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 los 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 , diseñador principal 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. :
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 del exponente está sesgado por 16383, lo que significa que se debe restar 16383 del valor en el campo del exponente para calcular la potencia real de 2 . [20] Se reserva un valor de campo 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 :
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 doble largo , y esto se especificó en los estándares C99 / C11 (aritmética de punto flotante IEC 60559 (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 extended
tipo y varios compiladores de Fortran tienen un REAL*10
tipo (análogo a REAL*4
y 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 .
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 está en decimal. Por lo tanto, un valor como 10,15 se representa en binario como equivalente a 10,1499996185, etc. en decimal,REAL*4
pero 10,15000000000000035527, etc. enREAL*8
: la interconversión implicará una aproximación, excepto aquellas pocas fracciones decimales que representan un valor binario exacto, como 0,625. . ParaREAL*10
, la cadena decimal es 10.1499999999999999996530553, etc. Los últimos 9 dígitos son el decimoctavo dígito fraccionario y, por lo 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), se vuelve a convertir 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 .
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 realiza directamente la exponenciación : en su lugar, 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 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 donde M es menor que 1, el valor es en realidad es anormal 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 F + 1 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]
long double
utilizando números de punto flotante de 80 bits en sistemas x86. Sin embargo, este es un comportamiento definido por la implementación y no es requerido, pero sí permitido por el estándar, como se especifica para el hardware IEEE 754 en el estándar C99 "Aritmética de punto flotante Anexo F IEC 60559". GCC también proporciona __float80
y __float128
tipos. [31]long-float
utilizando números de punto flotante de 80 bits en sistemas x86.real
se implementa utilizando el tamaño de punto flotante más grande implementado en hardware, por ejemplo, 80 bits para CPU x86 . En otras máquinas, este será el tipo de punto flotante más amplio admitido de forma nativa por la CPU, o doble precisión de 64 bits, lo que sea más amplio.extended
tipo de 80 bits disponible además de real
/ single
(32 bits) y double
(64 bits), ya sea de forma nativa (cuando hay presente un coprocesador de 80x87) o emulado (a través de la biblioteca Turbo87); este extended
tipo está disponible en plataformas de 16, 32 y 64 bits, posiblemente con relleno . [32]Float80
tipo de datos.EXT
de 10 bytes.EXTENDED