TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: piriots en 20 de Diciembre de 2005, 17:04:00

Título: Redondeo de variables
Publicado por: piriots en 20 de Diciembre de 2005, 17:04:00
Hola todopic!! Necesito hacer un voltimetro con un pic y me encuentro con un pequeño problema y es que el valor nunca sale un numero redondo, por ejemplo si tiene que salir 47 me sale 46.99. Estoy usando la libreria math.h para redondear pero no consigo nada. Para redondear uso esta linea de codigo

valor1=ceil(valor1); // para redondear

¿Estoy en lo correcto? ¿ porque nunca sale el numero redondo?

Salu2
Título: RE: Redondeo de variables
Publicado por: antoniof en 20 de Diciembre de 2005, 17:25:00
Buenas.

Supongo que estarás utilizando números decimales declarados como float.

Para pasarlos a número enteros int, en C se utiliza el casting

Veamos un ejemplo:

Supongamos que tenemos una variable "k" declarada como float cuyo valor es 47.85 y queremos obtener el entero de ese valor y guardarlo en la variable "i" declarada como int:

float k = 47.85;
int i = 0;

i = (int) k;

Lo que no se es si redondea (i=48) o trunca (i=47) el valor de k antes de guardarlo en i. Pruebalo a ver que tal.
Título: RE: Redondeo de variables
Publicado por: piriots en 21 de Diciembre de 2005, 05:56:00
Hola, lo he hecho como tu indicas y al sacar el valor por el lcd me sale algo que no tiene nada que ver con lo que tendria que salir, de momento lo que he hecho es no sacar los decimales por el lcd y de esta forma funciona.

Salu2
Título: RE: Redondeo de variables
Publicado por: antoniof en 21 de Diciembre de 2005, 05:59:00
Pues entonces el casting sólo funciona en el tubo C para el PC.

De todas formas lo he probado en C30 para obtener un byte(8bits) de una word (16bits) y funciona perfectamente.
Título: RE: Redondeo de variables
Publicado por: piriots en 21 de Diciembre de 2005, 07:02:00
Escrito originalmente por antoniof
Pues entonces el casting sólo funciona en el tubo C para el PC.


Yo estoy casi serguro que para el picc tambien tendria que funcionar porque me suena de verlo en algun programa. No pasa nada, lo dejare como lo tengo ya que el codigo no es muy largo y estoy usando un 16f877  o sea que me sobrara memoria.  Salu2 y gracias por tu ayuda antoniof
Título: RE: Redondeo de variables
Publicado por: Nocturno en 21 de Diciembre de 2005, 10:28:00
Si finalmente consigues que te funcione, pero el resultado es truncado en vez de redondeado, hay un truquillo que supongo la mayoría de vosotros ya conoce, pero que será muy útil para el que no lo sepa aún.

Se trata de sumar 0.5 a la cifra que quieres redondear antes de aplicar la función.

x = truncar ( y + 0.5 )

De esta manera, al truncarla, quedará el resultado entero de redondear el valor original. Si el decimal era 0.5 o superior, saldrá el entero superior; en caso contrario, el entero inferior.
Título: RE: Redondeo de variables
Publicado por: El_Coach en 21 de Diciembre de 2005, 11:54:00
Piriots, hay algo que no tengo claro.

Cuando dices redondear, ¿te refieres al entero más cercano?, por ejemplo:

a = 3,39;

a_redondeado = 3;

¿o te refieres al decimal más cercano?, ejemplo:

a = 3,39;

a_redondeado = 3,4;


Espero haberme explicado bien.
Es que si su función es la de voltímetro, pienso que por lo menos querrás ver el primer decimal, no?

Un saludo Navidad
Título: RE: Redondeo de variables
Publicado por: piriots en 21 de Diciembre de 2005, 16:06:00
Burno, sorry me he explicado mal. Es un voltimetro pero tambien amperimetro, el problema estaba en el amperimetro, como el valor de intensidad maximo a leer sera de 1A lo que he hecho es pasar el valor a miliamperios, de esta forma no necesito los decimales y puedo usar una variable int . Para el voltage uso 2 decimales y no he tenido problemas.

Todo esto es para un banco de pruebas para coches de slot.

Salu2
Título: RE: Redondeo de variables
Publicado por: El_Coach en 22 de Diciembre de 2005, 02:46:00
Ok, entendido Giño

Entonces creo que lo que propone Nocturno sería una buena solución.
Porque si mal no recuerdo cuando igualas una variable tipo int a un valor con decimales siempre coge el entero por debajo, es decir:

Codigo:

int   a;
float   b = 36,9;

a = b;

// Aquí "a" habría tomado el valor de 36



Por esto la solución que propone Nocturno me parece acertada RollEyes
Ya nos contarás...

Un saludo Navidad
Título: RE: Redondeo de variables
Publicado por: piriots en 22 de Diciembre de 2005, 05:41:00
He probado como dice nocturno y funciona bien!!. Muchas gracias por vuestra ayuda RebotadoRebotadoRebotado

Salu2
Título: RE: Redondeo de variables
Publicado por: lovando en 22 de Diciembre de 2005, 14:45:00
Hola

CCS 3.236 tiene la sgte opcion de formato para la salida de un printf:

g     Float with rounded decimal
f       Float with truncated decimal
 


osea:

float valor;
printf("Valor=%2.1g",valor);


Pruebalo, quizá igual sirva....

Chavela
 
Título: Re: Redondeo de variables
Publicado por: Enigma en 24 de Junio de 2010, 15:27:38
Una pregunta, lo que dice nocturno, de sumarle 0.5 a la variable... no lo entiendo....  si le sumo eso, nunca me dará un entero....?

Atte: Enigma... La llanerita de Guayana ;-)
Título: Re: Redondeo de variables
Publicado por: Nocturno en 24 de Junio de 2010, 17:30:11
No, eso no sirve para conseguir un entero, eso sirve para conseguir el entero más cercano, siempre que después de sumar 0.5 le quites los decimales.