En informática , decimal128 es un formato de número decimal de punto flotante que ocupa 128 bits en la memoria . Introducido formalmente en IEEE 754-2008 , [1] está destinado a aplicaciones donde es necesario emular el redondeo decimal con exactitud, como cálculos financieros y fiscales. [2]
El formato decimal128 admite 34 dígitos decimales de significando 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 el significando no está normalizado, la mayoría de los valores con menos de 34 dígitos significativos tienen múltiples representaciones posibles; 1 × 10 2 = 0,1 × 10 3 = 0,01 × 10 4 , etc. El cero tiene 12288 representaciones posibles (24576 incluido el cero negativo ).
El estándar IEEE 754 permite dos codificaciones alternativas para valores decimales128:
Esta norma no especifica cómo indicar qué codificación se utiliza, por ejemplo, en una situación en la que se comunican valores decimales128 entre sistemas.
Ambas alternativas proporcionan exactamente el mismo conjunto de números representables: 34 dígitos de significando y 3 × 2 12 =12 288 posibles valores de exponente.
En ambos casos, los 4 bits más significativos del 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 Infinity y NaN, se ignoran todos los demás bits de la codificación. Por lo tanto, es posible inicializar una matriz en Infinities o NaNs llenándola con un único valor de byte.
Este formato utiliza un mantra binario 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 11111111111 1111111111 1111111111 2 . La codificación puede representar significandos binarios 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 requiere 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 del significando están en el rango de 0 a 7 (0000 2 a 0111 2 ), o superior (1000 2 o 1001 2 ).
Si los 2 bits después del bit de signo son "00", "01" o "10", entonces el campo de exponente consta de los 14 bits que siguen al bit de signo, y el significado 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 significativo principal es 0.
Si los 2 bits después del bit de signo son "11", entonces el campo de exponente de 14 bits se desplaza 2 bits hacia la derecha (después del bit de signo y de los bits "11" posteriores), y el significado representado está en los 111 bits restantes. En este caso, hay una secuencia de 3 bits inicial implícita (es decir, no almacenada) "100" en el significado verdadero.
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" son parte del campo de exponente.
Para el formato decimal128, todos estos significandos 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 para decimal32 y decimal64 .
En los casos anteriores, el valor representado es
Si los cuatro bits después del bit de signo son "1111", entonces el valor es infinito o NaN, como se describe arriba:
s 11110 xx...x ±infinitos 11111 0x...xa tranquilo NaNs 11111 1x...xa señalización NaN
En esta versión, la mantisa se almacena como una serie de dígitos decimales. El dígito inicial está entre 0 y 9 (3 o 4 bits binarios), y el resto de la mantisa utiliza la codificación decimal densamente empaquetada (DPD).
Los 2 bits iniciales del exponente y el dígito inicial (3 o 4 bits) del mantis se combinan en los cinco bits que siguen al bit de signo.
Los doce bits siguientes son el campo de continuación del exponente, que proporciona los bits menos significativos del exponente.
Los últimos 110 bits son el campo de continuación del significando, que consta de once decletos de 10 bits . [3] Cada decleto 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 iniciales del exponente, y los tres bits siguientes se interpretan como el dígito decimal inicial (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]
Si los dos primeros bits después del bit de signo son "11", entonces los dos segundos bits son los bits iniciales del exponente, y el último bit tiene como prefijo "100" para formar el dígito decimal inicial (8 o 9):
s 1100 T (00)eeeeeeeeeeee (100T)[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] s 1110 T (10)eeeeeeeeeeee (100T)[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 NaNs, respectivamente.
La transcodificación DPD/3BCD para los declets se proporciona 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 x en la tabla anterior se ignoran en la entrada, pero siempre serán 0 en los resultados calculados. (Las codificaciones no estándar 8 × 3 = 24 llenan el espacio entre 10 3 = 1000 y 2 10 = 1024 ).
En los casos anteriores, con el verdadero significado como la secuencia de dígitos decimales decodificadas, el valor representado es