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

Re: Examen Febrero 2018 - problema 2, parte b

de Federico Rivero -
Número de respuestas: 0

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