La informática y los números

Resumen
Explicación de cómo los ordenadores tratan los números
Detalles

Introducción

Todos sabemos que los ordenadores representan los números (y todo) con ceros y unos, pero ¿cómo lo hacen?

En Matemáticas hay varias clases de números (números naturales, enteros, racionales, reales y complejos) y la informática representa cada tipo de número utilizando un método diferente. 

 

Números naturales

Si el número que queremos representar es el resultado de contar objetos, la solución es bien fácil: representamos  el número en binario y ya está. Por ejemplo: 1098 en binario se representaría como 10001001010.

Según el número de bits que empleemos podremos representar más o menos números. En la Tabla 1 vemos el número menor y mayor que podemos representar según la cantidad de bits que empleemos.

 

Tabla 1

Número bits

Número menor

Número mayor

Números representados

8

0

255

256

16

0

65535

65536

32

0

4294967295

4294967296

64

0

18446744073709551615

18446744073709551616

 

Estos números –los que se utilizan para contar- en Matemáticas se llaman números Naturales, y fueron los primeros números que utilizó el hombre. 

 

Números enteros

¿Pero, y si queremos representar un número negativo?  La solución más inmediata es dedicar la mitad de los números disponibles para representar los números positivos y la otra mitad para los negativos. En la Tabla 2 vemos la distribución de los números para el caso de 8, 16 y 32 bits. Se deduce de la Tabla 2 que si el primero bit es 0 el número es positivo y si es 1, negativo.

 

Tabla 2

Bits

Cero

Positivos

Negativos

8

00000000

Desde 00000001 hasta 01111111

Desde 10000000 hasta 11111111

8

0

Desde 1 hasta 127

Desde 128 hasta 255

8

0

Desde +1 hasta +127

Desde -1 hasta -128

16

0…0

Desde 0…1 hasta 01…1

Desde 10…0 hasta 11…1

16

0

Desde 1 hasta 32767

Desde 32768 hasta 65535

16

0

Desde +1 hasta +32767

Desde -1 hasta -65536

32

0…0

Desde 0…1 hasta 01…1

Desde 10…0 hasta 11…1

32

0

Desde 1 hasta 2147483647

Desde 2147483648 hasta 4294967295

32

0

Desde +1 hasta +2147483647

Desde -1 hasta -4294967296

 

Ejemplos de representación de números.

 

Tabla 3

Número

Representación en positivo

Representación en negativo

-1

00000001

10000000

-35

00100011

10100010

-127

01111111

11111110

-128

No existe

11111111

 

Este tipo de números en Matemáticas se llaman números Enteros.

 

Por razones de eficiencia del procesador los números negativos se representan en complemento a 2, que consiste en representar el número como si fuese positivo y después cambiar los ceros por unos y los unos por ceros  y sumar 1.

 

Si comparamos las representaciones de los números en la Tabla 3 y en la Tabla 4 vemos que, los números se han invertido de posición (observad los números -1 y -128 en ambas tablas).

 

Tabla 4

Número

Representación en positivo

Representación en negativo

-1

00000001

11111111

-35

00100011

11011101

-127

01111111

10000001

-128

No existe

10000000

 

Números racionales

Los números racionales son aquellos que representan el resultado de repartir algo en partes iguales. Por ejemplo, el número  2/5  representa 2 partes de un total de 5.

 

¿Y cómo representamos los números racionales? Malas noticias: estos números no tienen representación informática. Lo que se hace es representarlo por su equivalente número real (0,4 en nuestro ejemplo). Puede parecer que es igual, pero, aunque en este caso 2/5 = 0,4, en otros casos no es así (por ejemplo 1/3 = 0,333333, por muchos números 3 que escribamos). Y esto nos lleva a preguntarnos ¿cómo representamos los números con decimales?

 

Números reales

La primera solución fue tratarlos como números enteros, sabiendo que, en una posición determinada del número había una coma. Por ejemplo 125,37, se representaba internamente como el entero 12537 y el número 85,89 como 8589. 

 

Esta solución no presentaba problemas para las operaciones de sumar y restar (que por otro lado son las más habituales), pero las operaciones de multiplicar y dividir eran complejas porque el número de decimales resultante de la operación puede variar, como se aprecia en la Tabla 5.

Tabla 5

 

Entero

Real

Número 1

12537

125,37

Número 2

8589

85,89

Suma

21126

211,26

Resta

3948

39,48

Multiplicación

107680293

10768,0293

División

1,4596577

1,4596577

 

Este sistema de representación se llama de punto fijo, porque la coma (el punto en el mundo anglosajón) está en una posición fija (entre el segundo y tercer número  -comenzando por las unidades-  en nuestro ejemplo).

 

Otro inconveniente importante de este sistema de representación de los números reales es que no permite representar números muy cercanos a cero (por ejemplo 2,3 10^-124) o muy pequeños (-5,38 10^58) o muy grandes (4,342 10^68) y este tipo de números son muy frecuentes en el cálculo científico.

 

IEEE754

Desde antiguo los científicos habían resuelto el problema de representar números muy grandes o muy pequeños o muy cercanos a cero, utilizando la llamada notación científica, que no consiste en otra cosa que utilizar potencias de 10.  En la Tabla 6 se representan varios números en notación científica.

 

Tabla 6

Número

Representación

1000000

  1,00 x 10^6

453685

4,53685 x 10^5

0,0014

1,4 x 10^-3

 

Distintos fabricantes implementaron diferentes soluciones y, en consecuencia, el mismo programa ejecutado en diferentes máquinas obtenía resultados diferentes. Para resolver esta situación, en 1985 se publicó el estándar IEEE754 para aritmética de punto flotante.

 

IEEE754 reparte los bits disponibles (32 o 64 en las máquinas actuales) entre el signo, el exponente y la mantisa. Para representar el signo del número sólo necesitamos un bit (0 = positivo, 1 = negativo), el resto de los bits podríamos distribuirlos a conveniencia entre el exponente y la mantisa, pero el estándar lo fija en 11 bits para el exponente y 52 bits para la mantisa, para longitud de palabra 64 bits (8 y 23 para 32 bits). El signo del exponente se representa utilizando la mitad de los exponentes para los positivos y la otra mitad para los negativos.

 

En la Tabla 7 pueden verse los rangos de los números y sus representaciones para una longitud de palabra de 64 bits.

 

Si nos fijamos veremos que, también aquí, hay una limitación de los números que se pueden representar.   Por ejemplo no podemos representar números menores que -1,7976931348623157 10^308 ni mayores que 1,7976931348623157 10^308. Si excedemos esos números se producirá un error de desbordamiento que se señala con el número indicado en la Tabla 7.

Tampoco podemos representar números muy cercanos al cero. Por ejemplo, si nos estamos acercando al cero desde un número positivo y sobrepasamos el número 2,470328229206327 10^-324 se producirá un desbordamiento. Lo mismo si nos acercamos al cero desde un número negativo y sobrepasamos el número -2,4703282292062327 10^-324.

 

Pero esto no quiere decir que podamos representar todos los números entre esos márgenes.

 

En la Tabla 8 he representado tres números consecutivos en representación binaria  (no normalizados y normalizados) y su equivalente en representación decimal (el número que nosotros vemos), vemos que, aunque los números en binario son consecutivos,  los números, en representación decimal no son consecutivos (hay huecos entre ellos). Esto quiere decir que, entre otros muchos, no podemos representar el número 5,0 10^-324, ni el número 2,22507385850720300 10^-308.

 

Para cualquier exponente existe un número fijo de valores de la fracción (a veces se utiliza el término mantisa), así que, a medida que le exponente aumenta los números representados están cada vez más lejos.  Por ejemplo, si en potencias de 10,  representamos diez números en cada exponente, en la potencia 1 de 10 podemos representar el 10, 11, 12,… 19, en la potencia 2 de 10 podremos representar 100, 110, 120,… 190. Vemos que en la potencia 1 de 10 los números representados están más juntos que en la potencia 2.

 

En nuestro caso (64 bits) la cantidad de números entre dos exponentes es enorme  2^52 = 4503599627370496, pero el problema sigue existiendo. La conclusión es que sólo se puede representar de forma EXACTA determinados números reales y los números que “caigan” entre dos números IEEE754 consecutivos, habrá que redondearlos al anterior o al posterior.

 

Se distinguen dos tipos de números IEEE754, los normalizados y los desnormalizados (o no normalizados). Los números desnormalizados son los que tienen exponente cero. Estos números no normalizados son un truco que permite representar más números cercanos al cero pero tiene un coste y es que estos números tienen menos precisión, pues los ceros iniciales del número original se mueven a la izquierda hasta que se encuentra el primer 1 del número original. Por ejemplo: todos estos números: 00000000000000000000000000000000000000101010101010
00000000000000000000000000101010101010000000000000
00000000000000000010101010101000000000000000000000
00000000001010101010100000000000000000000000000000

se convierten en 10101010101000000000000000000000000000000000000000.

 

Tabla 7

Nombre rango

Signo
(s)
1 [63]

Exponente
(e)
11 [62-52]

Fracción
(m)
52 [51-0]

Rango hexadecimal (64 bits)

Rango potencias 2

Rango decimal

Quiet -NaN

1

11…11

11…11
:
10…01

FFFFFFFFFFFFFFFF
:
FFF8000000000001

 

 

Indeterminado

1

11…11

10…00

FFF8000000000000

 

 

Signaling NaN

1

11…11

01…11
:
00…01

FFF7FFFFFFFFFFFF
:
FFF0000000000001

 

 

Desbordamiento negativo (-infinito)

1

11…11

00…00

FFF0000000000000

< -(2-2-52) x 21023

<= -1.7976931348623158E+308

Negativo normalizado
 -1.m x 2e-1023

1

11…10
:
00…01

11…1
:
00…00

FFEFFFFFFFFFFFFF
:
8010000000000000

 -(2-2-52) x 21023
:
-2-1022

<= -1.7976931348623157E+308
:
-2.2250738585072014E-308

Negativo NO normalizado
 -0.m x 2-1022

1

00…00

11…1
:
00…01

800FFFFFFFFFFFFF
:
8000000000000001

 -(1-2-52) x 2-1022
:
-2
-1074
(-(1+2-52) x 2-1075
)

-2.2250738585072010E-308
:
-4.9406564584124654E-324
(-2.4703282292062328E-324)

Desbordamiento negativo (-0)

1

00…00

00…00

8000000000000000

-2-1075
:
< -0

-2.4703282292062327E-324
:
< -0

-0

1

00…00

00…00

8000000000000000

-0

-0

Quiet +NaN

0

11…11

11…11
:
10… 00

7FFFFFFFFFFFFFFF
:
7FF8000000000000

 

 

Signaling NaN

0

11…11

01…11
:
00…11

7FF7FFFFFFFFFFFF
:
7FF0000000000001

 

 

Desbordamiento positivo (+infinito)

0

11…11

00…00

7FF0000000000000

> (2-2-52) x 21023

>= 1.7976931348623158E+308

Positivo normalizado
 1.m x 2e-1023

0

11…10
:
00…01

11…11
:
00…00

7FEFFFFFFFFFFFFF
:
0010000000000000

(2-2-52) x 21023
:
2-1022

1.7976931348623157E+308
:
2.2250738585072014E-308

Positivo NO normalizado
 0.m x 2-1022

0

00…00

11…11
:
00…01

000FFFFFFFFFFFFF
:
0000000000000001

(1+2-52) x 2-1022
:
2-1074
((1-2-52) x 2-1075
)

2.2250738585072010E-308
:
4.9406564584124654E-324
(2.47032282292062328E-324)

Desbordamiento positivo (+0)

0

00…00

00…00

0000000000000000

>0
:
2-1075

2.4703282292062327E-324
:
>0

+0

0

00…00

00…00

0000000000000000

0

0


Tabla 8

Signo

Exponente

Fracción

Representación decimal

0

00000000000

000000000000000000000000000000000000000000000000001

2^-1022 x 2^-52 = 2^-1074 = 4,94065 x 10^-324

0

00000000000

000000000000000000000000000000000000000000000000010

  2^-1022 x 2^-51 = 2^-1073 = 9,88131 x 10^-324

0

00000000000

000000000000000000000000000000000000000000000000011

  2^-1022 x (2^-51 + 2^-52) = 2^-1073 + 2^-1074 = 1,48219 x 10^-323

0

00000000001

000000000000000000000000000000000000000000000000000

2^-1022= 2,225073855072038x 10^-308

0

00000000001

000000000000000000000000000000000000000000000000001

2^-1022(1+2^-51)=2,22507385850720237x10^-308

0

00000000001

000000000000000000000000000000000000000000000000010

  2^-1022(1+2^-50)=2,22507385850720335x10^-308

 


Errores que se pueden producir

Errores de desbordamiento: si una operación obtiene un resultado que está más allá de los límites de desbordamiento (hay 4 límites), se producirá un error. En algunos casos este error se produce en un cálculo intermedio y puede ser corregido alterando el orden de las operaciones, por ejemplo:  (10^200 X 10^200)/10^100 producirá un desbordamiento al realizar la multiplicación porque 10^400 excede el límite superior, pero la operación (10^200/10^100) X 10^200, no producirá el error.

 

Errores de redondeo: el redondeo es inevitable, hemos visto que no se pueden representar todos los números en IEEE754 (porque aunque se aumente la longitud de palabra, siempre habrá números que no se pueden representar), pero además, existen números, como los números periódicos, que tienen infinitas cifras decimales y estos no se pueden representar con exactitud.

 

Especificaciones y límites de Excel

Precisión numérica: 15 dígitos.  La razón del límite de 15 dígitos de precisión se deriva de la norma IEEE754. Observad estos tres números de la Tabla 8, y fijaros que es en la posición 15 donde cambia el número y que truncando el número en esa posición los números son consecutivos.

2,22507385850720138 10^-308
2,22507385850720237 10^-308
2,22507385850720335 10^-308

Número positivo más alto permitido: 1,79769313486231E+308

Número negativo más bajo permitido: -2,2251E-308

Número positivo más bajo permitido: 2,229E-308

Número negativo más alto permitido: -1E-307

 

Vemos que alguno de estos números no coinciden con los límites establecidos en la norma IEEE754, y ello es debido a que Microsoft no implementa los número desnormalizados de IEEE754.

 

Consulta también

La aritmética de punto flotante puede proporcionar resultados  no exactos en Excel

Cómo corregir errores de redondeo en aritmética de punto flotante

What Every Computer Scientist Should Know About Floating-Point Arithmetic

¿Le resultó útil este artículo?

Sentimos que no te haya sido de ayuda.

¡Genial! Gracias por los comentarios.

¿Qué tan satisfecho quedó con este artículo?

Gracias por sus comentarios, nos ayudan a mejorar el sitio.

¿Qué tan satisfecho quedó con este artículo?

Gracias por los comentarios.

 

Información sobre el artículo del foro


Última actualización: 28 de enero de 2021 Vistas 4.152 Se aplica a: