Dado un número , su representación en una dada base consiste en escribirlo como
donde el signo es igual a 0 o 1 y los coeficientes son enteros positivos menores que . En la vida real la suma tiene sólo un número finito de términos por lo que algunos números son sólo representados en forma aproximada. Usualmente, utilizamos el sistema decimal de numeración () pero la representación numérica en sistemas digitales se realiza en general en base 2, denominado sistema de numeración binaria, y ocasionalmente en base 16 (sistema hexadecimal). Los números se representan en memoria como una cadena de bits que pueden tomar los valores 0 ó 1. Se denomina byte a un grupo de 8 bits consecutivos.
En representación binaria un número entero se
escribe como
donde cada coeficiente es
igual a 1 o 0. Usualmente los números enteros ocupaban 4 bytes de memoria (32
bits), aunque en las computadoras modernas se pueden utilizar enteros de 64
bits. Los números que pueden almacenarse en la representación de 4 bytes están
en el rango:
para números enteros sin signo. Si se utiliza el primer bit de la izquierda como signo (0, positivo; 1, negativo) el rango se reduce a y para enteros con signo.
Las computadoras, con un número finito de bits, no pueden almacenar todos los números reales en forma exacta. Esto es similar a lo que ocurre con los números irracionales (como , , etc) o periódicos (, , ...) en el sistema decimal. La forma convencional de almacenar números reales en la memoria de una computadora es mediante el método llamado de punto flotante o floating point. Uno de los sistemas más comunes es la representación de números reales en simple precisión utilizada en la convención IEEE. En dicho sistema cada número de precisión simple ocupa 4 bytes (32 bits) que se destinan a: el signo (1 bit), un exponente (8 bits) y la parte fraccionaria de la mantisa (23 bits)1. De esta manera un número está determinado por estas tres cantidades
En esta representación, los 8 bits utilizados permiten que el exponente se encuentre en el rango . Se utiliza la constante para también obtener resultados negativos2. Observe que para ganar un bit, se omite la parte entera de la mantisa que se supone igual a 1. Esta representación se llama normalizada y se utiliza para todos los números, excepto aquellos muy grandes o muy pequeños. En particular, esta convención no permite representar el número 0.
Para aclarar los conceptos, consideremos algunos ejemplos de números
normalizados en precisión simple:
Hemos representado entre paréntesis la parte entera de la mantisa (que es igual a 1 siempre por convención. Debe notarse que el número final se obtiene considerando que:
Como segundo ejemplo veamos la conversión inversa, del número a sistema binario. El bit de signo es 0. El número puede expresarse
como la fracción y es mayor que 2 por lo que
debemos sacar un exponente positivo; en este caso, factorizamos por y nos quda que puede
escribirse como
por lo que, después de eliminar la parte entera y agregando
el signo y el exponente, el número es:
Una de las consecuencias más importantes de usar una representación de punto
flotante (con signo, mantisa y exponente) es que dos números deben tener el
mismo exponente para poder ser sumados o restados. Consideremos por ejemplo la
suma de los dos números anteriores y en sistema binario
Aquí hemos cambiado a una forma no normalizada para utilizar el mismo exponente en ambos números. Este procedimiento disminuye la cantidad de dígitos significantes.
La convención dice que se interpreta exactamente cero cuando todos los bits son 0. Esto significa, No sólo los de la mantisa sino también los del exponente. Nótese que para números de 64 bits (8 bytes) se interpreta que el número , ya que el exponente ha sido corrido en 127.
Hay dos tipos de infinitos: positivos y negativos. La convención para representar estos números dice que un número se considera infinito si cada uno de los bits del exponente es 1 y los de la mantisa son 0. El signo permite distinguir entre y .
En notación hexadecimal (base 16) cada símbolo representa un conjunto de cuatro bits (rango de 0 a 15). Algunos casos especiales son:
0 |
0x00000000 |
1.0 |
0x3f800000 |
0.5 |
0x3f000000 |
3 |
0x40400000 |
+inf |
0x7f800000 |
-inf |
0xff800000 |
+NaN |
0x7fc00000 or 0x7ff00000 |
En doble precisión se utilizan 64 bits (8 bytes): 1 para el signo, 11 bits para el exponente y 52 bits para la mantisa
En rigor, en la convención IEEE-754 el exponente varía en el rango [-126,127] y se reservan los restantes valores para representar números muy pequeños y muy grandes