Autor Tema: Floats y NaN  (Leído 2378 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Floats y NaN
« en: 14 de Enero de 2021, 09:00:42 »
¡Saludos al foro!

Tengo un "pequeño" problema:
Estoy leyendo un sensor que normalmente funciona correctamente pero me gustaría detectar cuando está averiado. La función de lectura lee el estado de un pin por lo que si está averiado me dará siempre un "1" o siempre un "0" pero el valor me lo devuelve como un float de 32 bits.
Cuando me da siempre "0" no tengo ningún problema en detectarlo porque el valor 0.0 de un float tiene todos los bits a cero, pero cuando el pin se queda enganchado a "1" el valor que toma el float es NaN (Rebosamiento), en hexadecimal 0xFFFFFFFF. Si el valor fuera un int32 no habría problema pero al ser un float no puedo hacer la comparación.
Lo tengo resuelto haciendo una conversión a int32 mediante punteros (tampoco se puede hacer una conversión del tipo VarInt32=(long long)VarFloat).
¿A alguien se le ocurre alguna manera más "elegante"?
Por si no queda claro lo que quiero es comprobar si una variable float tiene el el valor Nan (0xFFFFFFFF).

Gracias por anticipado!

NOTA: El compilador es el PICC versión 5.083.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Floats y NaN
« Respuesta #1 en: 14 de Enero de 2021, 09:45:34 »
Mirando por internet observo que. Si respeta el IEEE 754 entonces podes comparar el float entre si mismo y si es un NaN entonces te va a dar que es distinto. Me refiero a :

Código: C
  1. float f = NaN;
  2. if (f != f) {
  3.   // Entra si o si, debido a la implementación de la IEEE
  4. }

Pero esto depende del compilador, y tendrias que probarlo.

Tambien en C99 la libreria math.h tiene una funcion que se llama isnan(float) para determinar si es NaN

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Re:Floats y NaN
« Respuesta #2 en: 26 de Enero de 2021, 07:52:42 »
Nada, no funcionan en el PICC ninguna de las dos opciones, ni la comparación ni la función isnan. Tampoco he encontrado ninguna función equivalente.

Gracias por las sugerencias. Al parecer el PICC no sigue el standard IEEE 754. :5]
« Última modificación: 26 de Enero de 2021, 07:58:06 por PicMinor »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Floats y NaN
« Respuesta #3 en: 27 de Enero de 2021, 19:35:16 »
Por si podes tratarlo con alguna union, o bit a bit, te dejo un poco mas de datos.

Revisando tu mensaje:

Citar
Por si no queda claro lo que quiero es comprobar si una variable float tiene el el valor Nan (0xFFFFFFFF).

En realidad lo que define el NaN es que el exponente sea todos 1, y la fracción sea distinta de cero. Por lo que existe muchos valores. Tampoco importa el bit del signo.

Es decir

Si haces una OR de 0x 807F FFFF  ( negado de 0xEF80 0000 que son los bits del exponente), tendrias como resultado 0xFFFF FFFF, lo negas y comprobas por 0....

Esto NO es suficiente como para determinar si es NaN o no.
Luego hay que hacer una AND de 0x007F FFFF  (corresponde a la fraccion), y si es distinto de 0 entonces es una NaN, si es igual a 0 entonces es algún infinito, positivo o negativo según el signo.