Comparaciones en MIPS32 extrañas
Publicado por Wismichu (5 intervenciones) el 07/11/2015 11:39:55
Hola a todos, estoy intentando resolver este ejercicio, pero no tengo ni idea de que hacer.
"El objetivo de este ejercicio es desarrollar una pequeña biblioteca de funciones escritas en
ensamblador que permiten trabajar con números representados en coma flotante según el
estándar IEEE 754 de 32 bits (variables de tipo float en C). Las funciones a implementar son
las siguientes. Tenga en cuenta que la correspondiente rutina en ensamblador debe tener el
mismo nombre.
• int iszero(float x): devuelve 1 si el número x es cero y 0 en caso contrario. La
implementación realizada NO puede comparar x con el valor 0.0.
• int isinfpos(float x): devuelve 1 si el número x es más infinito y 0 en caso
contrario. La implementación realizada NO puede comparar x con el valor Inf.
• int isinfneg(float x): devuelve 1 si el número x es menos infinito y 0 en caso
contrario. La implementación realizada NO puede comparar x con el valor –Inf.
• int isnan(float x): devuelve 1 si el número x es NaN y 0 en caso contrario. La
implementación realizada NO puede comparar x con el valor NaN.
• int isnormal(float x): devuelve 1 si el número x se corresponde con un número
normalizado y 0 en caso contrario.
• int isunnormal(float x): devuelve 1 si el número x se corresponde con un
número no normalizado y 0 en caso contrario.
• int split(float x, int *s, int *e, int *m): la función descompone los
32 bits del número x, devolviendo tres valores: el signo en s, el exponente almacenado
en el número e y la mantisa almacenada en m . El valor del signo se almacenará en el bit
menos significativo de s; el valor del exponente en los 8 bits menos significativos de e
y el valor de la mantisa en los 23 bits menos significativos de m. En la implementación a
realizar tenga en cuenta que esta función recibe un único parámetro de entrada y
devuelve tres valores (el signo, el exponente y la mantisas).
• int join(int s, int e, int m, float *x): la función construye un número
en coma flotante y lo devuelve en x, a partir del bit de signo s, del exponente a
almacenar e y de la mantisa a almacenar m. El bit de signo se encuentra en el bit menos
significativo de s; el exponente en los 8 bits menos significativos de e; y la mantisa en
los 23 bits menos significativos de m. En la implementación a realizar tenga en cuenta
que esta función recibe tres parámetro de entrada y devuelve un único valor de tipo float."
Pues esa es la duda, como se sabe si un numero es cero pero sin compararlo con cero? A este paso me voy a pegar un tiro D:
No se si alguien tiene alguna idea, creo que igual usando alguna máscara de bit en concreto o algo...pero tampoco controlo muy bien ese tema. Cualquier aportacion se agradecera. :D
"El objetivo de este ejercicio es desarrollar una pequeña biblioteca de funciones escritas en
ensamblador que permiten trabajar con números representados en coma flotante según el
estándar IEEE 754 de 32 bits (variables de tipo float en C). Las funciones a implementar son
las siguientes. Tenga en cuenta que la correspondiente rutina en ensamblador debe tener el
mismo nombre.
• int iszero(float x): devuelve 1 si el número x es cero y 0 en caso contrario. La
implementación realizada NO puede comparar x con el valor 0.0.
• int isinfpos(float x): devuelve 1 si el número x es más infinito y 0 en caso
contrario. La implementación realizada NO puede comparar x con el valor Inf.
• int isinfneg(float x): devuelve 1 si el número x es menos infinito y 0 en caso
contrario. La implementación realizada NO puede comparar x con el valor –Inf.
• int isnan(float x): devuelve 1 si el número x es NaN y 0 en caso contrario. La
implementación realizada NO puede comparar x con el valor NaN.
• int isnormal(float x): devuelve 1 si el número x se corresponde con un número
normalizado y 0 en caso contrario.
• int isunnormal(float x): devuelve 1 si el número x se corresponde con un
número no normalizado y 0 en caso contrario.
• int split(float x, int *s, int *e, int *m): la función descompone los
32 bits del número x, devolviendo tres valores: el signo en s, el exponente almacenado
en el número e y la mantisa almacenada en m . El valor del signo se almacenará en el bit
menos significativo de s; el valor del exponente en los 8 bits menos significativos de e
y el valor de la mantisa en los 23 bits menos significativos de m. En la implementación a
realizar tenga en cuenta que esta función recibe un único parámetro de entrada y
devuelve tres valores (el signo, el exponente y la mantisas).
• int join(int s, int e, int m, float *x): la función construye un número
en coma flotante y lo devuelve en x, a partir del bit de signo s, del exponente a
almacenar e y de la mantisa a almacenar m. El bit de signo se encuentra en el bit menos
significativo de s; el exponente en los 8 bits menos significativos de e; y la mantisa en
los 23 bits menos significativos de m. En la implementación a realizar tenga en cuenta
que esta función recibe tres parámetro de entrada y devuelve un único valor de tipo float."
Pues esa es la duda, como se sabe si un numero es cero pero sin compararlo con cero? A este paso me voy a pegar un tiro D:
No se si alguien tiene alguna idea, creo que igual usando alguna máscara de bit en concreto o algo...pero tampoco controlo muy bien ese tema. Cualquier aportacion se agradecera. :D
Valora esta pregunta
0