Bitácora C1 22/05/2015

Se comenzó la clase directamente con introducción al nuevo tema (ya que la clase pasada fue el parcial! 🙂 )
Se entregó una fotocopia en la que se pedía encontrar una manera para comprimir los siguientes números:
62000000000000000000000 y 0,0000000000000000000062

y la manera de resolverlo es usando notación científica. La notación científica es una manera de abreviar números muy grandes o muy chicos que tengan muchos 0, y se lo logra de la siguiente manera: Se agarra la parte del número que es distinta que 0, en este caso, 62, y se lo multiplica por 10^n, (si el numero es mayor a 1) siendo n la cantidad de 0 que tiene el numero, en este caso, 21, o se lo multiplica por 10^-n (si el numero esta entre 1 y 0) siendo n tambien la cantidad de 0 que hay en el número. Por lo tanto: 62000000000000000000000 = 62 x 10^21 0,0000000000000000000062 = 62 x 10^-21 Generalizando, en decimal un numero se puede expresar en notación científica como: N = m x 10^e Donde N es el número, m la mantisa (la parte distinta de 0), y e es el exponente mencionado anteriormente.
Esto nos sirve para introducir el nuevo tema, Punto Flotante!

Punto Flotante usa está manera de representar números para poder representar cosas muy chicas, y también cosas muy grandes. La única diferencia que nos trae problemas es que la notación científica, como vimos, se usa en el sistema decimal, por lo que, así como está, no nos sirve para utilizar en sistema binario, pero… lo podemos salvar!

En vez de utilizar la representación de un número como la composición de «mantisa x 10^exponente», lo componemos como «mantisa x 2^exponente», y con eso ya lo podemos usar en sistema binario. Eso es exactamente lo que se hace en Punto Flotante.

Ahora… Cómo utilizo una cadena para escribir un número como una composición?

Fácil, se «parte» la cadena en dos partes, mantisa y exponente, dado que son las únicas variables que entran en juego en la composición. Por lo tanto, yo puedo armar sistemas de Punto Flotante de la siguiente manera:

Elijo un sistema para representar a la mantisa, por ejemplo, BSS(2), y elijo un sistema para representar al exponente, por ejemplo, BSS(3), y luego tengo que explicitar que parte de la cadena va primero, y que parte de la cadena va después, en este caso yo elegí que la mantisa vaya primero, y el exponente después ( e: BSS(2) / m: BSS(3) )

Ahora una cadena para nuestro sistema va a tener 2 bits para mantisa, y 3 bits para exponente, por lo tanto, van a ser cadenas de 5 bits.

Para interpretar una cadena en este sistema se hace lo siguiente:
* Recibo la cadena y la «parto» en mantisa y exponente, ya que voy a tener que interpretarlos por separado.

* Interpreto la mantisa en su correspondiente sistema (en este caso, BSS(2))

* Interpreto el exponente en su correspondiente sistema (en este caso, BSS(3))

* Compongo el numero con la formula (N = m x 2^e)

Ejemplo: 11110    e: BSS(2) / m: BSS(3)

* Parto la cadena -> 11 = m, 110 = e.

* Interpreto la mantisa -> I<BSS(2) 11> = 3

* Interpreto el exponente -> I <BSS(3) 110> = 6

* Compongo el número -> N = 3 x 2^6 = 3 x 64 = 192.

Luego pasamos a calcular el rango, con lo que necesitamos saber el máximo y el mínimo número representable…

Cómo saber cuál es el máximo y el mínimo representable? Veamos un par de ejemplos

  1. Exponente CA2(5) / Mantisa BSS(8)
    1. Máximo: I(01111 11111111) = I(11111111) *  2^15 = 255 * 2^15
    2. Mínimo: I(00000 00000000) = I(00000000) * 2^0 = 0 * 2^0, El número 0! (con cualquier exponente, en este caso elegí 2^0, pero puede ser cualquiera)
  2. Signo / Exponente CA2(5) /Mantisa Magnitud(7) (El signo y la magnitud del SM(8) estan separados, el signo al principio de la cadena, la magnitud al final)
    1. Máximo: I(0 01111 1111111) = +I(1111111) *  2^15 = +127 * 2^15
    2. Mínimo: I(1 01111 1111111) = +I(1111111) *  2^15 = – 127 * 2^15

Y así como podemos calcular el rango, también podemos calcular la resolución, pero…

Cuál es la resolución de estos sistemas? Veámoslo en el sistema e: BSS(2)/m: BSS(2),

Considerando la cadena: 1010. ¿Cuál es el siguiente número representable? el representado con la cadena 1011 o el de la cadena 1110?

I(1010) = 2*2^2 = 8

I(1011) = 3*2^2 = 12   ¡ok!

I(1110) = 2*2^3 = 16

Resolución I(1011) – I(1010) = 3*2^2 – 2*2²^2= (3-2) * 2^2 = 1*2^2 = 2^2

Veamos ahora este caso ¿Que cadena sigue a la cadena 0110?

I(0110) = 2 * 2^1

I(0111) = 3 * 2^1

Resolución = I(0111) – I(0110) = 3*2^1 – 2*2`1 = (3-2) * 2^1 = 1*2^1 = 2^1

Cómo vemos, la resolución no es la misma en ambos casos. Esto se debe a que en Punto Flotante, la resolución (a diferencia con todos los otros sistemas que veníamos usando) NO es constante. La resolución varía porque tenemos un exponente que la hace variar. Cuando el exponente es menor, la resolución es menor, cuando el exponente es mayor, la resolución es mayor.

Normalización

Algo peculiar de la notación científica es la posibilidad de representar el mismo valor con distintas cadenas. Veamos este ejemplo en el sistema m:sm(8) / e:ca2(5), con el formato (s)(e)(m)

Interpretar:

  • 0 00000 0000100 → + 4 * 2⁰ = 2²
  • 0 00001 0000010 → + 2 * 2¹ = 2²
  • 0 00010 0000001 → + 1 * 2² = 2²

No es deseable tener múltiples representaciones para el mismo valor, entonces se elige una sola de ellas como cadena válida para ese número: la que comienza con 1 en la mantisa. En el ejemplo anterior la única cadena normalizada es 0 11100 1000000, pues:

e = Ica2(11100) = – I(00011+1) = -4

m = Ism(01000000) =2⁶

n= 64 * 2⁻⁴ = 2⁶*2⁻⁴ = 2²

¡Pero esto implica que se descarten la mitad de las cadenas!

Para solucionarlo, considerando que todas las cadenas empezarían con 1 entonces no tiene sentido escribir ese primer 1, y por lo tanto se lo deja implícito.