El punto flotante hexadecimal (ahora llamado HFP por IBM ) es un formato para codificar números de punto flotante introducido por primera vez en las computadoras IBM System / 360 y compatible con las máquinas posteriores basadas en esa arquitectura, [1] [2] [3] también como máquinas que estaban destinadas a ser compatibles con la aplicación System / 360. [4] [5]
En comparación con el punto flotante IEEE 754 , el formato HFP tiene un significado más largo y un exponente más corto . Todos los formatos HFP tienen 7 bits de exponente con un sesgo de 64. El rango normalizado de números representables es de 16 −65 a 16 63 (aproximadamente 5.39761 × 10 −79 a 7.237005 × 10 75 ).
El número se representa mediante la siguiente fórmula: (−1) signo × 0. significando × 16 exponente − 64 .
Precisión simple de 32 bits
Un número HFP de precisión simple (llamado "corto" por IBM) se almacena en una palabra de 32 bits:
1 7 24 (ancho en bits) S Exp Fracción 31 30 ... 24 23 ... 0 (índice de bits) * * La documentación de IBM enumera los bits de izquierda a derecha, de modo que el bit más significativo se designa como bit número 0.
En este formato, el bit inicial no se suprime y el punto de base (hexadecimal) se establece a la izquierda del significado (fracción en la documentación de IBM y las figuras).
Dado que la base es 16, el exponente en esta forma es aproximadamente el doble del equivalente en IEEE 754, para tener un rango de exponente similar en binario, se necesitarían 9 bits de exponente.
Ejemplo
Considere codificar el valor −118,625 como un valor de punto flotante de precisión simple HFP.
El valor es negativo, por lo que el bit de signo es 1.
El valor 118.625 10 en binario es 1110110.101 2 . Este valor se normaliza moviendo el punto de base a la izquierda cuatro bits (un dígito hexadecimal) a la vez hasta que el dígito más a la izquierda sea cero, produciendo 0.01110110101 2 . Los dígitos restantes de la derecha se rellenan con ceros, lo que da como resultado una fracción de 24 bits de .0111 0110 1010 0000 0000 0000 2 .
El valor normalizado movió el punto de la base dos dígitos hexadecimales a la izquierda, lo que produjo un multiplicador y un exponente de 16 +2 . Se suma un sesgo de +64 al exponente (+2), lo que da como resultado +66, que es 100 0010 2 .
La combinación del signo, exponente más sesgo y fracción normalizada produce esta codificación:
S Exp Fracción 1 100 0010 0111 0110 1010 0000 0000 0000
En otras palabras, el número representado es -0.76A000 16 × 16 66-64 = -0,4633789 ... × 16 2 = -118,625
Mayor número representable
S Exp Fracción 0 111 1111 1111 1111 1111 1111 1111 1111
El número representado es + 0.FFFFFF 16 × 16127 - 64 = ( 1-16 −6 ) × 16 63 ≈ +7.2370051 × 10 75
Número normalizado positivo más pequeño
S Exp Fracción 0 000 0000 0001 0000 0000 0000 0000 0000
El número representado es +0,1 16 × 16 0 - 64 = 16 −1 × 16 −64 ≈ +5,397605 × 10 −79 .
Cero
S Exp Fracción 0 000 0000 0000 0000 0000 0000 0000 0000
Cero (0.0) se representa en forma normalizada como todos los bits cero, que es aritméticamente el valor +0.0 16 × 16 0 - 64 = +0 × 16 −64 ≈ +0.000000 × 10 −79 = 0. Dada una fracción de todos- bits cero, cualquier combinación de bit de signo positivo o negativo y un exponente sesgado distinto de cero producirá un valor aritméticamente igual a cero. Sin embargo, la forma normalizada generada para cero por el hardware de la CPU es cero de todos los bits. Esto es cierto para los tres formatos de precisión de punto flotante. La suma o resta con otros valores de exponente puede perder precisión en el resultado.
Problemas de precisión
Dado que la base es 16, puede haber hasta tres bits cero iniciales en el significado binario. Eso significa que cuando el número se convierte en binario, puede haber tan solo 21 bits de precisión. Debido al efecto de "precisión de oscilación", esto puede provocar que algunos cálculos sean muy inexactos.
Un buen ejemplo de inexactitud es la representación del valor decimal 0.1. No tiene una representación binaria o hexadecimal exacta. En formato hexadecimal, se representa como 0.19999999 ... 16 o 0.0001 1001 1001 1001 1001 1001 1001 ... 2 , es decir:
S Exp Fracción 0 100 0000 0001 1001 1001 1001 1001 1010
Esto tiene solo 21 bits, mientras que la versión binaria tiene 24 bits de precisión.
Seis dígitos hexadecimales de precisión equivalen aproximadamente a seis dígitos decimales (es decir, (6 - 1) log 10 (16) ≈ 6,02). Una conversión de un flotante hexadecimal de precisión simple a una cadena decimal requeriría al menos 9 dígitos significativos (es decir, 6 log 10 (16) + 1 ≈ 8.22) para volver a convertir al mismo valor flotante hexadecimal.
64 bits de doble precisión
El formato HFP de doble precisión (llamado "largo" por IBM) es el mismo que el formato "corto" excepto que el campo de fracción es más ancho y el número de doble precisión se almacena en una palabra doble (8 bytes):
1 7 56 (ancho en bits) S Exp Fracción 63 62 ... 56 55 ... 0 (índice de bits) * * La documentación de IBM enumera los bits de izquierda a derecha, de modo que el bit más significativo se designa como bit número 0.
El exponente de este formato cubre solo alrededor de una cuarta parte del rango como el formato binario IEEE correspondiente.
14 dígitos hexadecimales de precisión equivalen aproximadamente a 17 dígitos decimales. Una conversión de flotante hexadecimal de doble precisión a cadena decimal requeriría al menos 18 dígitos significativos para volver a convertir al mismo valor flotante hexadecimal.
128 bits de precisión extendida
Llamado de precisión extendida por IBM, se agregó un formato HFP de precisión cuádruple a la serie System / 370 y estaba disponible en algunos modelos S / 360 (S / 360-85, -195 y otros por solicitud especial o simulado por software de SO ). El campo de fracción de precisión extendida es más ancho y el número de precisión extendida se almacena como dos palabras dobles (16 bytes):
Pieza de orden superior 1 7 56 (ancho en bits) S Exp Fracción (14 dígitos de orden superior) 127 126 ... 120 119 ... 64 (índice de bits) * Pieza de orden inferior 8 56 (ancho en bits) No usado Fracción (14 dígitos de orden inferior) 63 ... 56 55 ... 0 (índice de bits) * * La documentación de IBM enumera los bits de izquierda a derecha, de modo que el bit más significativo se designa como bit número 0.
28 dígitos hexadecimales de precisión equivalen aproximadamente a 32 dígitos decimales. Una conversión de HFP de precisión extendida a una cadena decimal requeriría al menos 35 dígitos significativos para volver a convertir al mismo valor HFP. El exponente almacenado en la parte de orden inferior es 14 menos que la parte de orden superior, a menos que sea menor que cero.
Operaciones aritmeticas
Las operaciones aritméticas disponibles son sumar y restar, tanto normalizadas como no normalizadas, y comparar. La pre-normalización se realiza en función de la diferencia de exponentes. Multiplica y divide los valores no normalizados de prenormalización y trunca el resultado después de un dígito de protección. Hay una operación de mitad para simplificar la división por dos. A partir de ESA / 390, hay una operación de raíz cuadrada. Todas las operaciones tienen un dígito de guarda hexadecimal para evitar la pérdida de precisión. La mayoría de las operaciones aritméticas se truncan como simples calculadoras de bolsillo. Por lo tanto, 1 - 16 −8 = 1. En este caso, el resultado se redondea desde cero. [6]
IEEE 754 en mainframes IBM
Comenzando con el S / 390 G5 en 1998, [7] los mainframes de IBM también han incluido unidades de coma flotante binarias IEEE que cumplen con el estándar IEEE 754 para aritmética de coma flotante . El punto flotante decimal IEEE se agregó a IBM System z9 GA2 [8] en 2007 usando milicode [9] y en 2008 a IBM System z10 en hardware. [10]
Los mainframes modernos de IBM admiten tres radicales de punto flotante con 3 formatos hexadecimales (HFP), 3 formatos binarios (BFP) y 3 formatos decimales (DFP). Hay dos unidades de coma flotante por núcleo; uno que admite HFP y BFP, y otro que admite DFP; hay un archivo de registro, FPR, que contiene los 3 formatos. A partir del z13 en 2015, los procesadores han agregado una función de vector que incluye 32 registros de vector, cada uno de 128 bits de ancho; un registro vectorial puede contener dos números de coma flotante de 64 bits o cuatro de 32 bits. [11] Los 16 registros tradicionales de punto flotante se superponen sobre los nuevos registros vectoriales, por lo que algunos datos pueden manipularse con instrucciones tradicionales de punto flotante o con las instrucciones vectoriales más nuevas.
Usos especiales
El formato IBM HFP se utiliza en:
- Archivos de transporte SAS 5 (.XPT) como lo requiere la Administración de Alimentos y Medicamentos (FDA) para las presentaciones de estudios de Solicitud de Nuevos Medicamentos (NDA), [12]
- Archivos de datos GRIB (GRIdded Binary) para intercambiar la salida de modelos de predicción meteorológica ( formato de punto flotante de precisión simple IEEE en la versión actual),
- Archivos de formato GDS II (Graphic Database System II) ( OASIS es el reemplazo), y
- Archivos en formato SEG Y (Society of Exploration Geophysicists Y) (en 2002 se añadió al formato el punto flotante de precisión simple IEEE). [13]
Como IBM es el único proveedor restante de hardware (y solo en sus mainframes) que utiliza el formato HFP, ningún formato de archivo popular lo requiere; Excepto que la FDA requiere el formato de archivo SAS y "Todos los números de punto flotante en el archivo se almacenan utilizando la representación del mainframe de IBM. [...] La mayoría de las plataformas utilizan la representación IEEE para números de punto flotante. [...] Para para ayudarlo a leer y / o escribir archivos de transporte, proporcionamos rutinas para convertir de representación IEEE (ya sea big endian o little endian) a representación de transporte y viceversa ". [12] El código para el formato de IBM también está disponible en LGPLv2.1 . [14]
Sistemas que utilizan el formato de punto flotante de IBM
- IBM System / 360 y sucesores
- RCA Spectra 70
- Sistema eléctrico inglés 4
- GEC 4000 series miniordenadores
- Computadoras Interdata de 16 y 32 bits
- Serie SDS Sigma
- Texas Instruments 990 /12
- Datos generales miniordenadores
Ver también
- Estándar IEEE 754 para aritmética de coma flotante
- Formato binario de Microsoft
Referencias
- ^ IBM System / 360 Principles of Operation , IBM Publication A22-6821-6, Séptima edición (13 de enero de 1967), pp.41-50
- ^ IBM System / 370 Principios de funcionamiento , publicación de IBM GA22-7000-4, quinta edición (1 de septiembre de 1975), pp.157-170
- ^ z / Architecture Principles of Operation , IBM Publication SA22-7832-01, Segunda edición (octubre de 2001), capítulo 9 y siguientes.
- ^ Xerox Data Systems (octubre de 1973). Xerox SIGMA 7 Computer Reference Manyal . pag. 48 . Consultado el 13 de noviembre de 2020 .
- ^ RCA (marzo de 1966). Procesadores Spectra 70: 35 45 55 (PDF) . pag. 184 . Consultado el 13 de noviembre de 2020 .
- ^ Soporte de punto flotante mejorado ESA / 390: una descripción general
- ^ Schwarz, EM; Krygowski, CA (septiembre de 1999). "La unidad de coma flotante S / 390 G5". Revista de investigación y desarrollo de IBM . 43 (5,6): 707–721. doi : 10.1147 / rd.435.0707 .
- ^ Duale, AY; Decker, MH; Cremallera, H.-G .; Aharoni, M .; Bohizic, TJ (enero de 2007). "Punto flotante decimal en z9: una perspectiva de implementación y prueba". Revista de investigación y desarrollo de IBM . 51 (1.2): 217–227. CiteSeerX 10.1.1.123.9055 . doi : 10.1147 / rd.511.0217 .
- ^ Heller, LC; Farrell, MS (mayo de 2004). "Millicode en un procesador IBM zSeries". Revista de investigación y desarrollo de IBM . 48 (3.4): 425–434. CiteSeerX 10.1.1.641.1164 . doi : 10.1147 / rd.483.0425 .
- ^ Schwarz, EM; Kapernick, JS; Cowlishaw, MF (enero de 2009). "Soporte de coma flotante decimal en el procesador IBM System z10". Revista de investigación y desarrollo de IBM . 53 (1): 4: 1–4: 10. doi : 10.1147 / JRD.2009.5388585 .
- ^ z / Principios de funcionamiento de la arquitectura
- ^ a b "El diseño de registro de un conjunto de datos en formato de transporte SAS (XPORT)" (PDF) . Consultado el 18 de septiembre de 2014 .
- ^ http://www.seg.org/documents/10161/77915/seg_y_rev1.pdf
- ^ https://cran.r-project.org/web/packages/SASxport/SASxport.pdf
Otras lecturas
- Sweeney, DW (1965). "Un análisis de la adición de punto flotante". Revista de sistemas de IBM . 4 (1): 31–42. doi : 10.1147 / sj.41.0031 .
- Tomayko, J. (verano de 1995). "Problemas de coma flotante del sistema 360". IEEE Annals of the History of Computing . 17 (2): 62–63. doi : 10.1109 / MAHC.1995.10006 . ISSN 1058-6180 .
- Harding, LJ (1966), "Idiosyncrasies of System / 360 Floating-Point", Actas de SHARE 27, 8 al 12 de agosto de 1966 , presentado en SHARE XXVII, Toronto, Canadá
- Harding, LJ (1966), "Modifications of System / 360 Floating Point", SHARE Secretary Distribution , págs. 11-27, SSD 157, C4470
- Anderson, Stanley F .; Earle, John G .; Goldschmidt, Robert Elliott; Powers, Don M. (enero de 1967). "El IBM System / 360 Modelo 91: Unidad de ejecución de punto flotante". Revista de investigación y desarrollo de IBM . 11 (1): 34–53. doi : 10.1147 / rd.111.0034 .
- Padegs, A. (1968). "Aspectos estructurales del System / 360 Model 85, III: Extensiones a la arquitectura de punto flotante". Revista de sistemas de IBM . 7 (1): 22-29. doi : 10.1147 / sj.71.0022 .
- Schwarz, EM; Sigal, L .; McPherson, TJ (julio de 1997). "Unidad de coma flotante CMOS para el S / 390 Parallel Enterprise Server G4". Revista de investigación y desarrollo de IBM . 41 (4.5): 475–488. doi : 10.1147 / rd.414.0475 .