El estándar IEEE 754-2008 incluye formatos de números decimales de punto flotante en los que el mantisa y el exponente (y las cargas útiles de NaNs ) se pueden codificar de dos maneras, denominadas codificación binaria y codificación decimal . [1]
Ambos formatos descomponen un número en un bit de signo s , un exponente q (entre q min y q max ) y un mantisa de p dígitos c (entre 0 y 10 p −1 ). El valor codificado es (−1) s ×10 q × c . En ambos formatos el rango de valores posibles es idéntico, pero difieren en cómo se representa la mantisa c . En la codificación decimal, se codifica como una serie de p dígitos decimales (usando la codificación decimal densamente empaquetada (DPD)). Esto hace que la conversión a formato decimal sea eficiente, pero requiere una ALU decimal especializada para procesarla. En la codificación decimal entera binaria ( BID ), se codifica como un número binario.
Teniendo en cuenta que 2 10 = 1024 es apenas un poco más que 10 3 = 1000, es posible empaquetar eficientemente números decimales de 3 n dígitos en 10 n bits binarios. Sin embargo, los formatos IEEE tienen significados de 3 n + 1 dígitos, lo que generalmente requeriría 10 n + 4 bits binarios para su representación.
Esto no sería eficiente, porque solo se necesitan 10 de los 16 valores posibles de los cuatro bits adicionales. Se puede diseñar una codificación más eficiente utilizando el hecho de que el rango del exponente tiene la forma 3×2 k , por lo que el exponente nunca comienza con 11
. Utilizando la codificación Decimal32 (con un significado de 3*2+1 dígitos decimales) como ejemplo ( e
representa exponente, m
mantisa, es decir, significado):
0mmm
, al omitir el bit 0 inicial el mantis cabe en 23 bits:s 00eeeeee (0)mmm mmmmmmmmmm mmmmmmmmmms 01eeeeee (0)mmm mmmmmmmmmm mmmmmmmmmms 10eeeeee (0)mmm mmmmmmmmmm mmmmmmmmmm
100m
, al omitir los 100 bits iniciales, la mantisa cabe en 21 bits. El exponente se desplaza 2 bits y un 11
par de bits muestra que se está utilizando esta forma:s 1100eeeeee (100)m mmmmmmmmmm mmmmmmmmmms 1101eeeeee (100)m mmmmmmmmmm mmmmmmmmmms 1110eeeeee (100)m mmmmmmmmmm mmmmmmmmmm
s 1111
:s 11110 xxxxxxxxxxxxxxxxxxxxxxxxs 111110 xxxxxxxxxxxxxxxxxxxxxxxxs 111111 xxxxxxxxxxxxxxxxxxxxxxxx
Los bits que se muestran entre paréntesis son implícitos : no están incluidos en los 32 bits de la codificación Decimal32, pero están implícitos en los dos bits después del bit de signo.
Las codificaciones Decimal64 y Decimal128 tienen campos de exponente y significado más grandes, pero funcionan de manera similar.
Para la codificación Decimal128, 113 bits de significando son realmente suficientes para codificar 34 dígitos decimales, y la segunda forma en realidad nunca es necesaria.
Un número decimal de punto flotante se puede codificar de varias maneras, las diferentes maneras representan diferentes precisiones, por ejemplo, 100.0 se codifica como 1000×10 −1 , mientras que 100.00 se codifica como 10000×10 −2 . El conjunto de posibles codificaciones del mismo valor numérico se denomina cohorte en el estándar. Si el resultado de un cálculo es inexacto, se conserva la mayor cantidad de datos significativos seleccionando el miembro de la cohorte con el entero más grande que se puede almacenar en la mantisa junto con el exponente requerido.
El estándar IEEE 754r propuesto limita el rango de números a un mantisa de la forma 10 n −1, donde n es el número de dígitos decimales completos que se pueden almacenar en los bits disponibles para que el redondeo decimal se efectúe correctamente.
Una codificación binaria es inherentemente menos eficiente para conversiones hacia o desde datos codificados en decimal, como cadenas ( ASCII , Unicode , etc.) y BCD . Por lo tanto, es mejor elegir una codificación binaria solo cuando los datos son binarios en lugar de decimales. IBM ha publicado algunos datos de rendimiento no verificados. [2]