TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: fastyx2 en 12 de Julio de 2007, 15:56:41
-
Amigos : estoy teniendo un fallo en un circuito que hice de control de temperatura con una sonda tipo lm35 entrando por el adc del pic.
mi pregunta concreta es si esta expresion puede traeme resultados inciertos ( ejemplo 1999 grados de presentacion de display )
if ( med_actual( ) < tempe_mod2 - 1 ) // si se esta enfriando ... // med_actual () es float y tempe_mod2 es un entero de 8
desde ya gracias!!
-
Puedes hacer un "cast" a la variable antes de comparar:
if ( med_actual( ) < (float)tempe_mod2 - 1 ) // si se esta enfriando ...
Puedes leer sobre cast aquí
http://acm.asoc.fi.upm.es/documentacion/c2007/manual/node6.html
-
gracias por contestar!
lo voy a hacer , ahora mi pregunta es si la falta del cast puede ocasionar resultados inciertos o aleatorios
-
No sé en tu caso, pero yo me he llevado muchas desagradables sorpresas por operar con distintos tipos de variables.
-
lo voy a hacer , ahora mi pregunta es si la falta del cast puede ocasionar resultados inciertos o aleatorios
Un definitivo SI.
De hecho, creo que también debieras agregar (float) al 1
if ( med_actual( ) < (float)tempe_mod2 - (float) 1 )
Saludos
-
ok gracias , lo del 1 no lo habia notado.
pregunta: si quiero promover el resultado en entero , cuando paso el float a entero , como lo corta?( que hace con 2,27 por ejemplo )
desde ya gracias!
-
ok gracias , lo del 1 no lo habia notado.
pregunta: si quiero promover el resultado en entero , cuando paso el float a entero , como lo corta?( que hace con 2,27 por ejemplo )
desde ya gracias!
Creo que eso no te lo hará el compilador, al menos no que yo sepa. Es que directamente jamás se me ocurrió probarlo
Debes buscar alguna función que convierta de float a entero. No es lo mismo 'castear' que 'convertir'.
El casteo es algo fijo , siempre igual, que trata con cosas que tienen que ver con cómo almacenará la información.
El pasar de float a entero, es completamente dependiente del exponente.
-
es verdad lo que decis Maunix , yo me referia a que cuando haces la promocion hacia entero del float con el casting , que es lo que pasa con la parte decimal , si la redondea hacia abajo , hacia arriba o no se que otra cosa...
-
Al convertir un float en entero, se trunca la parte decimal.
Un saludo
-
gracias jfh900!
-
De hecho, creo que también debieras agregar (float) al 1
if ( med_actual( ) < (float)tempe_mod2 - (float) 1 )
Otra forma de hacerlo es escribir el 1 directamente en formato float:
if ( med_actual( ) < (float)tempe_mod2 - 1.0 )
-
es verdad lo que decis Maunix , yo me referia a que cuando haces la promocion hacia entero del float con el casting , que es lo que pasa con la parte decimal , si la redondea hacia abajo , hacia arriba o no se que otra cosa...
A pesar de que ya te han respondido, te pido consideres lo siguiente: un casteo, no es más que formatear una variable de una a otra. Es decir, un char lo casteamos en integer, un integer en un float. El proceso queda 'fijo' en el código y por ende no se lo modifica.
Esas rutinas, no saben qué valor tendrán las variables, simplemente transforman su resultado y por ende siempre truncan. No se meten con redondeos y esas cosas, porque ya no hablaríamos de un 'casteo' sino de una función diferente.
Saludos
Manolo, confieso que lo uso así como tu lo pusiste en mis códigos, pero la verdad no se me ocurrió cuando puse mi ejemplo :D :D , y la verdad que hacía falta que lo ponga alguien porque es la forma más simple. :mrgreen: :mrgreen:
-
les agradezco a todos por la contestación!
por una cuestion de velocidad del micro y porque lo puedo hacer voy a promover la variable float a entero y hacer la comparación. no tengo problema con la parte decimal para que prendan o apaguen los equipos de calefaccion o refrigeracion , por eso puedo truncar el float , pero en la presentacion del display si coloco el valor
del float.
-
ya entiendo a que se refieren cuando se habla de 'cast' , yo había usado ese operador y ahora es que me doy cuenta que tiene nombre