Autor Tema: Obtener parte decimal de un float y compararla en C para mcus  (Leído 2138 veces)

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

Desconectado genisuvi

  • PIC16
  • ***
  • Mensajes: 114
Obtener parte decimal de un float y compararla en C para mcus
« en: 02 de Abril de 2019, 04:37:01 »
Buenos días, no sé si ya hay algún hilo antiguo sobre el tema, pero no lo vi. Necesito redondear el resultado de una operación en decimal al valor entero anterior o posterior en función de que el primer decimal sea mayor o menor que 5, en C para microcontroladores. Con esta precisión ya me estaría bien para lo que quiero obtener.
Me gustaría saber opciones de código eficiente para obtener el decimal de este resultado y compararlo con el valor constante 5. Teniendo en cuenta que el valor del resultado no siempre tiene 1 entero, puede que tenga decimales y centenas. Creo que esta peculiaridad lo hace algo más complejo que si fuera siempre el mismo orden de magnitud.

Por ejemplo:
Result = 5.8
fracción = 8
fracción >= 5 --> Result = 5 + 1 = 6
result = 27.3
fracción = 3
fraccion <= 5 --> Result = 27


Sugerencias para obtener la parte entera en una variable y la parte fraccionaria en otra? La parte entera creo que con guardarla en una variable tipo int se truncaría el decimal automáticamente, pero con respecto a la parte fraccionaria, cómo puedo obtenerla? Se me ocurre restar la parte entera del valor original en modo float y multiplicarlo x 10. Luego lo convertirlo con un cast a int. Pero no sé si tenéis una sugerencia más elegante.

Gracias por adelantado.
Saludos a todos!
 
« Última modificación: 02 de Abril de 2019, 06:35:43 por genisuvi »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8136
Re:Obtener parte decimal de un float y compararla en C para mcus
« Respuesta #1 en: 02 de Abril de 2019, 10:14:25 »
Usa la funcion round() de la libreria math.h

es decir :

round(5.6) ---> 6
round(5.5) ---> 5
round(5.4) ---> 5

La otra que se me ocurre es asi, tal cual vos dijiste:

Código: C
  1. float Result;
  2. int entero;
  3.  
  4. int main()
  5. {
  6.     Result = 5.5;
  7.     entero = a;      // Aca me deja entero igual a 5
  8.     Result *= 10;   // Result pasa a ser 55
  9.     if ((Result - entero*10)>5) entero++;      // Resto 55 - 50, si supera los 5 entonces sumo 1 a entero, sino nada
  10.    
  11.     printf("entero: %i",entero);
  12.  
  13.     return 0;
  14. }

Podes ejecutarlo aca:

https://onlinegdb.com/Hkm1fJZKN

Y cambiar el 5.5 por 5.6 para que veas la diferencia.

Otra forma:

Código: C
  1. float a;
  2. int b;
  3.  
  4. int main()
  5. {
  6.     a = 52.6;
  7.     b = a*10;       // Multiplico por 10 y guardo en un entero, se castea y queda 526
  8.     b += 4;          // Sumo 4, porque si mi decimal (ahora unidad) era 6, debe pasar al siguiente quedándome 530
  9.     b /= 10;         // Finalmente divido por 10.
  10.    
  11.     printf("float: %f , int: %i",a,b);
  12.  
  13.     return 0;
  14. }

Cual es mas eficiente va a depender del compilador. Eso queda a revisión tuya sobre el tiempo que demanda.
« Última modificación: 02 de Abril de 2019, 10:27:58 por KILLERJC »

Desconectado genisuvi

  • PIC16
  • ***
  • Mensajes: 114
Re:Obtener parte decimal de un float y compararla en C para mcus
« Respuesta #2 en: 03 de Abril de 2019, 11:50:50 »
Muchas gracias por tu consejo. Con ocupar menor espacio posible o un menor tiempo de ejecución que mis propuestas me doy por satisfecha. Siempre me complico sin necesidad yo sola. Saludos!


 

anything