Las computadoras pueden hacer operaciones numéricas a una altísima velocidad y ésta es una de sus aplicaciones más importantes. Pero, ¿cómo maneja los números una computadora? En esta sección veremos la forma en que las computadoras "almacenan" los números y qué tipo de números pueden utilizar.
Hay distintas representaciones de los números en las computadoras, la mayoría utiliza el sistema binario o de base 2 , que es el más natural en su medio, pues los sistemas de almacenamiento de información están basados en grandes cantidades de imanes microscópicos, cada uno de los cuales puede estar sólo en dos "estados" o posiciones —digamos, para simplificar, que pueden estar orientados hacia arriba o hacia abajo—. Al guardar y acomodar información en un dispositivo de memoria, se ordenan algunos de esos microimanes hacia arriba y otros hacia abajo. Un sistema tal consta, entonces, de muchos elementos de memoria, cada uno de los cuales, al presentar estos dos estados, puede almacenar lo que se llama un bit de información. Un bit es la información requerida para saber si una cosa es o no es. Repasemos este concepto: supongamos que el "sí" lo representamos con un imán orientado hacia arriba y el "no" con un imán orientado hacia abajo. El "sí" o la orientación hacia arriba, puede a su vez representarse numéricamente con un 1, y el "no" o la orientación hacia abajo, con un 0. Así, por ejemplo, si tenemos ocho de estos microelementos de memoria podemos representar su estado con un conjunto ordenado de ocho dígitos binarios, o sea con ocho números cada uno de los cuales es 0 o 1. Por ejemplo:
01100101
00000001
11110000
10101010,
etcétera,
son posibles estados de este conjunto ordenado de elementos de memoria o bits. Si el bit tiene un 1, decimos que está encendido, y si tiene un 0, decimos que está apagado. Un conjunto ordenado de ocho bits se llama byte. Los bytes se usan mucho en la computación porque las primeras computadoras se hicieron para operar sobre bytes, que se ha conservado como el elemento mínimo de información que se usa en ellas.
Supongamos ahora que deseamos usar un byte para representar un número. ¿Cómo lo hacemos? ¿Cuántos números distintos podríamos representar con un byte? Lo natural es utilizar el sistema de numeración binario que consiste en asignar al primer bit del byte el valor 1 si está encendido —y 0 si no lo está—; al segundo, el valor 2; al tercero, el 4 = 22 ; al cuarto, el 8 = 23 ; al siguiente, el 16 = 24 y así sucesivamente. Recordemos que 21 = 2 y 20 = 1. Por analogía con la notación decimal, consideramos a los bits ordenados de derecha a izquierda. Así, por ejemplo, un byte con la configuración 01100101 representa al número 101, según se muestra a continuación:
01100101 = 0 × 27 + 1 × 26 + 1 × 25 + 0 × 24 + 0 × 23 + 1 × 22 + 0 × 21 + 1 × 20
= 26 + 25 + 22 + 20
= 64 + 32 + 4 + 2 = 101
Cabe agregar que el 101 es el ciento uno y está en representación decimal y no binaria, es decir, lo interpretamos como:
101 = 1 × 102 + 0 × 101 + 1 × 100.
Ahora vamos a representar el número 213 en forma binaria como ejercicio. Para ello, hay que comenzar por descomponerlo en una suma de potencias de 2:
Como 213 es mayor que 128 = 27, usaremos 27. Nos falta agregar 213 − 128 = 85, que es mayor que 64 = 26 , por lo que también sumaremos 26 . Nos falta incluir 85 − 64 = 21, que es menor que 32 = 25 pero mayor que 16 = 24, por lo que no agregaremos 25, pero sí 24. Finalmente, pongamos lo que nos falta: 21 − 16 = 5 = 22 + 20. Por lo tanto, la descomposición del número 213 que buscábamos es 27 + 26 + 24 + 22 + 20, que nos lleva a la representación binaria 11010101.
Las computadoras manejan los números enteros en formato binario como el que se acaba de mostrar, excepto que, en general, el primer bit se usa para indicar el signo del número —es decir, si el primer bit está "apagado" el número es positivo, si en cambio está "encendido", el número es negativo. Uno de los formatos más utilizados en las computadoras para los números enteros es de 16 bits, llamado short en el lenguaje Java. En un entero de tipo short, el primer bit se utiliza para el signo y los 15 restantes para el valor absoluto del número. Así, por ejemplo, la expresión binaria:
10000000 11010101
representa el número – 213. Con 16 bits se pueden representar números enteros entre −(215 − 1) = −32 767 y 215 − 1 = 32 767 . En efecto, con 15 bits, el número más grande que puede representarse es aquel en el que todos los bits están encendidos, por lo tanto es 214 + 213 + . . . + 21 + 20 = 215 − 1 = 32 767. Para los negativos se puede aprovechar un número más pues el cero está representado entre los no negativos y no hace falta repetirlo, pero no explicaremos la razón de este detalle. La forma más usada para expresar enteros en lenguaje Java es con el tipo int que usa 32 bits, con los cuales se pueden representar los enteros entre −231 = −2 147 483 648 y 231 − 1 = −2 147 483 647.
La representación de los números reales es bastante más complicada. En lenguaje Java se emplea la norma IEEE 754—estándar internacionalmente aceptado y usado casi universalmente—. En esta norma hay dos formatos de datos, llamados float y double, que son los más utilizados. Ambos son "representaciones de punto flotante"; el primero se denomina de precisión simple y usa 32 bits, mientras que el segundo, que es de doble precisión, usa 64 bits. También hay uno de cuádruple precisión que utiliza 128 bits. Aunque el más usado es el de 64 bits, para simplificar aquí la presentación, describiremos solamente el de 32 bits.
De los 32 bits que se usan para representar un número real del tipo float, el primero se usa para el signo, los ocho siguientes para el exponente y los 23 restantes para la mantisa, como se muestra a continuación al representar el número −231.125:
La fórmula para obtener el número en cuestión a partir de la representación consiste en, primero, obtener los valores enteros positivos del signo, el exponente y la mantisa a partir de sus representaciones decimales. Así:
s = 1
x = 27 + 22 + 21 = 134
m = 222 + 221 + 218 + 217 + 216 + 213 = 6758400
Y luego, al aplicar la fórmula:
que, en este caso, nos lleva al resultado:
Estas representaciones de punto flotante están diseñadas no sólo para guardar los números dentro de las computadoras, sino para que éstas puedan realizar las operaciones básicas con gran eficiencia. Los procesadores numéricos de las computadoras son los que se encargan de realizar dichas operaciones. Afortunadamente, las computadoras hacen todo esto con mucha facilidad y rapidez. Lo importante es que tengamos conciencia de que la representación de números reales dentro de las computadoras dista mucho de ser equivalente al concepto matemático de número real; más bien, se limita a utilizar sólo algunos números —todos racionales con expansión binaria finita— y a brindarnos buenas aproximaciones de resultados de los cálculos que les pedimos hacer. Por ejemplo, el número π presentado en formato de doble precisión es equivalente al valor decimal:
3.141592653589793
mientras que sabemos que el verdadero valor de π tiene una representación decimal infinita.