TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: robin_ramirez en 10 de Mayo de 2008, 14:29:45
-
hola amigos del foro mi problema es que no se como obtener la parte decimal de una variable de tipo coma flotante (float) para pasarla a formato entero (int), tambien deseo saber cuantos bits componen a la fparte entera y cuantos a la parte decimal
para esto se debe tener en cuenta que yo utilizo el compilador picc.
!gracias¡
favor enviar info al email: robin_elmello@hotmail.com
-
Hola
Las respuestas del foro no son para llevar, solo se te va a ayudar aquí mismo.
Para obtener la parte entera de un entero solo usa un casting...
float flotante=12.345;
int entero;
...
entero=(int)flotante;
-
Saludos Robin!
Pues ya migsantiago te ha resuelto tu problema.
Solo quería acotar lo que él mismo te menciona:
Las respuestas del foro no son para llevar, solo se te va a ayudar aquí mismo.
Recuerda Robin, que la idea del foro es compartir conocimientos y experiencias entre todos...
Si deseas la ayuda en tu correo deberás buscarte a un asesor personal o algo así...
En cambio, si la información se deja aquí en el foro estará al alcance de otra persona que tal vez tenga el mismo problema, y pueda beneficiarse también.
Es decir, como los mosqueteros: "uno para todos y todos para uno" :D
Espero que entiendas nuestras razones.
Ok nos leemos! :mrgreen:
-
Lo que también pudo haber hecho es usar el botón notificar...
(http://www.todopic.com.ar/foros/Themes/babylon/images/spanish/notify.gif)
Y recibir por mail los cambios en el tema actual.
Nunca lo he probado :mrgreen:
-
existen varias funciones... algunas redondean, otras truncan... aca te dejo un par:
f=CEIL(x)
Obtiene el valor entero más pequeño, mayor que el número real x, es decir, hace un redondeo por exceso del número real x. El prototipo de esta función está en el fichero de cabecera math.h
Ejemplo:
float x = 2.871;
num = ceil(x) // num = 3
f=FLOOR(x)
Calcula el valor entero más grande, menor que el número real x, es decir, hace un redondeo por defecto del número real x. El prototipo de esta función está en el fichero de cabecera math.h.
Ejemplo:
float x = 3.871;
num = floor(x) // num = 3
-
Hola gera
Hay que tener cuidado al usar floor o ceil ya que los tipos de esas funciones no son int, que es lo que necesita robin.
double floor ( double x );
float floor ( float x );
long double floor ( long double x );
Por cierto, el foro me mandó un mail haciendo uso de la función Notificar, funciona OK.
-
Hola robin, el formato de coma flotante que utiliza CCS ocupa 4 bytes, el primero (el LSB) contiene 8 bits con el exponente del numero, el siguiente bit es el bit de signo y los 23 bits restantes son la mantisa del mismo.
Si lo que quieres hacer es obtener la parte decimal del numero float entonces te conviene utilizar la función modf asi:
float Numero;
float Entero;
float Decimal;
Decimales = modf(Numero, &Entero);
Decimales almacena la componente decimal com ".xxxx". El problema con tratar de guarda la parte decimal de un numero float en una variable int es que indudablemente habra casos en los que perderás información, por lo tanto no existirá una función existente en CCS que pueda contemplar todos los casos. Deberás crear una particular para tu programa, puedes partir de la función modf, pero deberas ver como transladar los decimales a un numero entero representativo de los mismos. Realmente es raro lo que quieres lograr, porque con un int solo podrás obtener decimales con un incremento mínimo de +-0.0039, y es un desperdicio de exactitud para un numero float. Si solo necesitas una precisión de 3 o 4 decimales puedes utilizar un formato de numero con coma fija y asi tragar muchos menos recursos de tu querido PIC. Es lo que yo utilizo en mis proyectos en estos casos, sobre todo con la serie 16F o inferiores.
Esperamos tu respuesta. Un saludo.
-
gracias amigos por sus respuestas yo ya he utilizado la funcion modf pero no me arrojo ningun dato
yo pienso eue es por el pic que estoy utilizando (pic16f873a) o por el simulador proteus. de todos modos tendre en cuenta las otras opciones que ustedes me plantean. les estoy agradecido por sus consejos sobre el foro espero ayudarles en algo mas adelante. :-/
-
Hola robin, recuerda que para poder utilizar la función modf necesitas especificar #include <math.c> de lo contrario no podrás compilarlo siquiera. Ni el PIC ni el simulador pueden ser objeto de fallas en este caso, yo creo que le estas errando en el código. Recuerda que modf retorna el resultado en float y con el siguiente formato "0.xxxx" asi que si quieres pasarlo a int directamente el resultado va a ser cero siempre.
Te recomiendo de nuevo que pruebes con utilizar numeros decimales con coma fija, en CCS puedes implementarlo con variables de 2 bytes o de 4 bytes (long y int32 respectivamente). Aunque la variable int32 ocupe la misma cantidad de memoria que un numero float, los calculos con la variable entera son mucho mas rapidos (hasta 30 o 40 veces mas rapido). Además extraer los decimales de un numero con coma fijo se puede hacer con operaciones de manipulacion de bits, que tambien son extremadamente rápidas.
Un saludo.
-
Gonzalo_BlackHawk podrias subir un ejemplo de codigo como decis.
Muchas gracias
-
Hola tengo una duda como puedo poner en practica esto en el c++, en una tarea me dejaron el siguiente problema
Leer un número en formato real e imprimir su parte entera.
la verdad estoy confundido y ya nose como solucionarlo
:? :?
-
Hola tengo una duda como puedo poner en practica esto en el c++, en una tarea me dejaron el siguiente problema
Leer un número en formato real e imprimir su parte entera.
la verdad estoy confundido y ya nose como solucionarlo
:? :?
Hola
Las respuestas del foro no son para llevar, solo se te va a ayudar aquí mismo.
Para obtener la parte entera de un entero solo usa un casting...
float flotante=12.345;
int entero;
...
entero=(int)flotante;