[2018][Febrero][Problema 2] Parte b

[2018][Febrero][Problema 2] Parte b

de Esteban Gabriel Risso Martinez -
Número de respuestas: 4

Buenas, para la parte de cargar la ROM se me ocurrió otra solución y quería consultar si esta bien.

La idea del ejercicio es representar la parte entera de un numero en punto flotante de precisión simple en complemento a 2 de 16 bits y ademas indicar con un bit si hay overflow.

El rango de complemento a 2 es: - 2^15 <= N <=  2^15 - 1 o sea que la máxima parte entera puede ser 0111 1111 1111 1111 (representación de 2^15 - 1 en comp2) y la mínima 1000 0000 0000 0000 (representación de -2^15 en comp2).


max = (1 << 15); 

min = (1 << 15) - 1;

oveflow = 0;

parte_entera = 0;

if (exp >= 0) {

      parte_entera = (1 << exp) | (frac << (23 - exp)); 

      if (parte_entera > max || parte_entera < min) {

            overflow = (1 << 16);

            parte_entera = 0;

      }

}

if (signo == 1) {

      parte_entera = - parte_entera + 1;

}

ROM [dir] = overflow | parte_entera;


Muchas gracias!

Saludos.


En respuesta a Esteban Gabriel Risso Martinez

Re: Examen Febrero 2018 - problema 2, parte b

de Federico Rivero -

Estimado,

Me queda la duda de si ese código es en sustitución de alguna parte de la solución oficial, o si te falta algo, porque ni exp, ni dir, ni frac están definidos cuando comienza tu código!  Faltó algo?

Saludos,

        Federico

En respuesta a Federico Rivero

Re: Examen Febrero 2018 - problema 2, parte b

de Esteban Gabriel Risso Martinez -

Era una sustitución si, la idea es algo así:

void cargarROM() {

     for (dir = 0; dir < (1<<32); dir ++) {

         singo = dir / 1<<31; 

         exp = ((dir / 1<<23) & 0xFF) – 127;

         frac = dir & 0x7FFFFF;

         // código que comente anteriormente.

     }

}

En respuesta a Esteban Gabriel Risso Martinez

Re: Examen Febrero 2018 - problema 2, parte b

de Esteban Gabriel Risso Martinez -

Agradezco si alguien me puede decir si la solución que propuse esta bien.


Muchas gracias!

Saludos.

En respuesta a Esteban Gabriel Risso Martinez

Re: Examen Febrero 2018 - problema 2, parte b

de Federico Rivero -

Estimado:

Disculpame que me olvidé de responder. La solución tiene algunos problemas. En la siguiente línea:

      parte_entera = (1 << exp) | (frac << (23 - exp)); 


el resultado se empieza a complicar cuando exp >= 23. Personalmente no sé qué resultado da la operación << cuando la cantidad de bits a shiftear es negativa, pero asumiendo que el resultado sea 0 siempre (por decir algo), de igual manera hay problema con la primer parte de la operación, ya que el 1 << exp va a dar 0 cuando exp >= 32, porque el resultado es mayor a lo que puede guardar un int (el resultado se trunca). Por lo tanto no vas a poder reconocer el overflow con la comparación con el máximo y el mínimo.

Hay otro tema con la comparación de máximos y mínimos. En tu código no definiste los tipos de max o min, pero asumiendo que sean ints de 32 bits como el resto de las variables, entonces min y max son dos valores positivos muy cercanos. No me queda claro bien cuál es tu idea con la comparación:

if (parte_entera > max || parte_entera < min) 

Pero por lo que está escrito ahí arriba, esa comparación va a ser casi siempre verdadera. Capaz te falta un signo de menos en el mínimo, pero para hacer una comparación con signo tendrías que también ponerle signo a la parte_entera según el signo del número en punto flotante... hay que trabajarlo un poco más.

Por último, al final:

if (signo == 1) {

      parte_entera = - parte_entera + 1;

}

Entiendo que estás tratando de cambiar el signo a la parte entera en complemento a 2, pero hay un error conceptual, y es que el operador (-) ya realiza la negación en complemento a dos! Por lo tanto no es necesario sumar uno. Podrías realizar la conversión manualmente utilizando el operador (~) para realizar la negación bit a bit, pero no es necesario porque basta con el operador (-)

Saludos,
       Federico