En informática , decimal128 es un formato de número de punto flotante decimal definido por el estándar IEEE 754 para aritmética de punto flotante . [ 1 ] Es uno de los formatos de intercambio básicos del estándar, diseñado para ofrecer una representación decimal exacta con alta precisión, destinada a aplicaciones como cálculos financieros y fiscales donde el redondeo decimal debe reproducirse exactamente. [ 2 ] Introducido en IEEE 754-2008 y mantenido en IEEE 754-2019 , decimal128 codifica un signo, una mantisa en base 10 y un exponente en 128 bits (16 bytes). El exponente proporciona un rango dinámico extremadamente amplio, por lo que la precisión de 34 dígitos, no el rango, es la característica notable de decimal128.
Formato
El formato decimal128 admite 34 dígitos decimales de mantisa y un rango de exponente de −6143 a +6144, es decir, ±0.000 000 000 000 000 000 000 000 000 000 000 × 10 ^ −6143 a ±9.999 999 999 999 999 999 999 999 999 999 999 × 10 ^ 6144 . Debido a que la mantisa no está normalizada, la mayoría de los valores con menos de 34 dígitos significativos tienen múltiples representaciones posibles; 1 × 10² = 0,1 × 10³ = 0,01 × 10⁴ , etc. Este conjunto de representaciones para un mismo valor se denomina cohorte . El cero tiene 12288 representaciones posibles (24576 si se incluyen ambos ceros con signo , en dos cohortes diferentes).
Codificación de valores decimal128
El estándar IEEE 754 permite dos codificaciones alternativas para los valores decimal128:
- La codificación binaria, basada en el decimal entero binario (BID): La mantisa se codifica como un entero sin signo escrito en binario .
- La codificación decimal, basada en el sistema decimal densamente empaquetado (DPD): la mantisa se codifica como un entero sin signo escrito en decimal, con grupos de 3 dígitos empaquetados juntos en un declet y una regla especial para el dígito más significativo.
Esta norma no especifica cómo indicar qué codificación se utiliza, por ejemplo, en una situación en la que se comunican valores decimal128 entre sistemas.
Ambas alternativas proporcionan exactamente el mismo conjunto de números representables: 34 dígitos de mantisa y 3 × 2 12 =12 288 posibles valores de exponente.
En ambos casos, los 4 bits más significativos de la mantisa (que en realidad solo tienen 10 valores posibles) se combinan con los 2 bits más significativos del exponente (3 valores posibles) para utilizar 30 de los 32 valores posibles de 5 bits en el campo de combinación. Las combinaciones restantes codifican infinitos y NaN .
En el caso de Infinito y NaN, se ignoran todos los demás bits de la codificación. Por lo tanto, es posible inicializar un array con Infinito o NaN rellenándolo con un único valor de byte.
BID Binario Entero Decimal campo de mantisa
Este formato utiliza una mantisa binaria de 0 a 10 34 − 1 = 9 999 999 999 999 999 999 999 999 999 999 999 = 1ED09BEAD87C0378D8E63FFFFFFFF 16 = 0111 1011010000 1001101111 1010101101 1000011111 0000000011 0111100011 0110001110 0110001111 1111111111 1111111111 1111111111 2 . La codificación puede representar mantisas binarias de hasta 10 × 2 110 − 1 = 12 980 742 146 337 069 071 326 240 823 050 239, pero los valores mayores que 10 34 − 1 son ilegales (y el estándar exige que las implementaciones los traten como 0, si se encuentran en la entrada).
Como se describió anteriormente, la codificación varía dependiendo de si los 4 bits más significativos de la mantisa están en el rango de 0 a 7 (0000 2 a 0111 2 ), o más alto (1000 2 o 1001 2 ).
Si los 2 bits después del bit de signo son "00", "01" o "10", entonces el campo del exponente consta de los 14 bits que siguen al bit de signo, y la mantisa son los 113 bits restantes, con un bit 0 inicial implícito : s 00eeeeeeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 01eeeeeeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 10eeeeeeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt Esto incluye números subnormales donde el dígito de la mantisa inicial es 0.
Si los 2 bits posteriores al bit de signo son "11", entonces el campo del exponente de 14 bits se desplaza 2 bits a la derecha (después del bit de signo y los bits "11" subsiguientes), y la mantisa representada se encuentra en los 111 bits restantes. En este caso, hay una secuencia implícita (es decir, no almacenada) de 3 bits "100" en la mantisa verdadera. s 1100eeeeeeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 1101eeeeeeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 1110eeeeeeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt La secuencia de 2 bits "11" después del bit de signo indica que hay un prefijo implícito de 3 bits "100" en la mantisa. Compárese con tener un 1 implícito en la mantisa de los valores normales para los formatos binarios. Los bits "00", "01" o "10" forman parte del campo del exponente.
Para el formato decimal128, todas estas mantisas están fuera del rango válido (comienzan con 2 113 > 1,038 × 10 34 ), y por lo tanto se decodifican como cero, pero el patrón es el mismo que decimal32 y decimal64 .
En los casos anteriores, el valor representado es
- (−1) signo × 10 exponente−6176 × mantisa
Si los cuatro bits posteriores al bit de signo son "1111", entonces el valor es infinito o NaN, como se describió anteriormente:
s 11110 xx...x ±infinito s 11111 0x...xa silencioso NaN s 11111 1x...xa señalización NaN
Campo de mantisa decimal densamente empaquetado (DPD)
En esta versión, la mantisa se almacena como una serie de dígitos decimales. El primer dígito se encuentra entre 0 y 9 (3 o 4 bits binarios), y el resto de la mantisa utiliza la codificación decimal densamente empaquetada (DPD).
Los dos primeros bits del exponente y el primer dígito (3 o 4 bits) de la mantisa se combinan en los cinco bits que siguen al bit de signo.
Los doce bits que siguen constituyen el campo de continuación del exponente, que proporciona los bits menos significativos del mismo.
Los últimos 110 bits son el campo de continuación de la mantisa, que consta de once declets de 10 bits . [ 3 ] Cada declet codifica tres dígitos decimales [ 3 ] utilizando la codificación DPD.
Si los dos primeros bits después del bit de signo son "00", "01" o "10", entonces esos son los bits principales del exponente, y los tres bits siguientes se interpretan como el dígito decimal principal (0 a 7): s 00 TTT (00)eeeeeeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 01 TTT (01)eeeeeeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 10 TTT (10)eeeeeeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] Si los dos primeros bits después del bit de signo son "11", entonces los dos bits siguientes son los bits principales del exponente, y al último bit se le antepone "100" para formar el dígito decimal principal (8 o 9): s 1100 T (00)eeeeeeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 1101 T (01)eeeeeeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 1110 T (10)eeeeeeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] Las dos combinaciones restantes (11110 y 11111) del campo de 5 bits se utilizan para representar ±infinito y NaN, respectivamente.
La transcodificación DPD/3BCD para los declets se muestra en la siguiente tabla. b9...b0 son los bits del DPD y d2...d0 son los tres dígitos BCD.
Los 8 valores decimales cuyos dígitos son todos 8 o 9 tienen cuatro codificaciones cada uno. Los bits marcados con una "x" en la tabla anterior se ignoran en la entrada, pero siempre serán 0 en los resultados calculados. (Las 8 × 3 = 24 codificaciones no estándar cubren el intervalo entre 10³ = 1000 y 2¹⁰ = 1024 ) .
En los casos anteriores, con la verdadera mantisa como la secuencia de dígitos decimales decodificados, el valor representado es
Véase también
- ISO/IEC 10967 , Aritmética independiente del lenguaje
- Notación Q (notación científica)
Referencias
- ↑ IEEE Computer Society (29 de agosto de 2008). Norma IEEE para aritmética de punto flotante . IEEE . doi : 10.1109/IEEESTD.2008.4610935 . ISBN 978-0-7381-5753-5Norma IEEE 754-2008.
- ↑ Cowlishaw, Mike (2007). "Preguntas frecuentes sobre aritmética decimal – Parte 1 – Preguntas generales" . speleotrove.com . IBM Corporation . Consultado el 29 de julio de 2022 .
- 1 2 Müller, Jean-Michel; Brisebarre, Nicolás; de Dinechin, Florent; Jeannerod, Claude-Pierre; Lefèvre, Vicente; Melquiond, Guillaume; Revol, Nathalie ; Stehlé, Damián; Torres, Serge (2010). Manual de aritmética de coma flotante (1 ed.). Birkhäuser . doi : 10.1007/978-0-8176-4705-6 . ISBN 978-0-8176-4704-9. LCCN 2009939668 .
- ↑ Cowlishaw, Michael Frederic (13 de febrero de 2007) [3 de octubre de 2000]. "Resumen de la codificación decimal densamente empaquetada" . IBM . Archivado del original el 24 de septiembre de 2015. Consultado el 7 de febrero de 2016 .
- Tipos de punto flotante