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