Autor Tema: Redondeo de variables  (Leído 10197 veces)

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

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
Redondeo de variables
« 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

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Redondeo de variables
« Respuesta #1 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.

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: Redondeo de variables
« Respuesta #2 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

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Redondeo de variables
« Respuesta #3 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.

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: Redondeo de variables
« Respuesta #4 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Redondeo de variables
« Respuesta #5 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.

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: Redondeo de variables
« Respuesta #6 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
"Hazlo o no lo hagas, pero nunca lo intentes"

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: Redondeo de variables
« Respuesta #7 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

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: Redondeo de variables
« Respuesta #8 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
"Hazlo o no lo hagas, pero nunca lo intentes"

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: Redondeo de variables
« Respuesta #9 en: 22 de Diciembre de 2005, 05:41:00 »
He probado como dice nocturno y funciona bien!!. Muchas gracias por vuestra ayuda RebotadoRebotadoRebotado

Salu2

Desconectado lovando

  • PIC16
  • ***
  • Mensajes: 193
RE: Redondeo de variables
« Respuesta #10 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
 

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Redondeo de variables
« Respuesta #11 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 ;-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Redondeo de variables
« Respuesta #12 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.