TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Chenao en 07 de Noviembre de 2008, 20:34:38

Título: Aproximación
Publicado por: Chenao en 07 de Noviembre de 2008, 20:34:38

Saludos

Tengo una duda en el lenguaje C, la duda es la siguiente si tengo un valor, por ejemplo 34.57 y quiero aproximarlo al valor mayor, es decir, 35. Sera que existe alguna función de hago esto. "No la he podido encontrar". Si me pueden colaborar le agraderia bastante.


Un saludo desde Pereira - Colombia
Título: Re: Aproximación
Publicado por: gera en 07 de Noviembre de 2008, 21:36:53
Existen dos funciones, ceiling() y floor(), que aproximan por defecto o por exceso. Tambien existen otras que truncan con cierto grado de precisión pero no recuerdo cuales eran. Revisa la libreria math.h
Suerte!!
Título: Re: Aproximación
Publicado por: jeremylf en 08 de Noviembre de 2008, 02:42:03
Nose si esto valdra pero se me ocurrio hace un tiempo y al parecer da lo mismo.

float varf = 34.57;
int8 var;

Para floor seria:
var = (byte)varf;
var -> 34;

Y para ceil:
var = ((byte)varf) + 1;
var -> 35

Corriganme si me equivoco porq me quede con la duda de esto. Aun asi, usa lo que te recomiendo gera.

Salu2.
Título: Re: Aproximación
Publicado por: Marttyn en 08 de Noviembre de 2008, 03:43:16
Lo que comenta jeremylf tiene pinta de funcionar, lo unico que habria que cambiar es "(byte)" por "(long)" si tu numero es mayor a 255 y menor a 65535. Si tu numero es mayor a 65535 y menor a 4294967295 deberas usar "(long long)", aunque dudo que trabajes con numeros tan grandes  :mrgreen:
Segun el Math.h esto es lo que hace el FLOOR y el CEIL:

Código: C
  1. float CEIL_FLOOR(float x, int n)
  2. {
  3.    float y, res;
  4.    long l;
  5.    int1 s;
  6.  
  7.    s = 0;
  8.    y = x;
  9.  
  10.    if (x < 0)
  11.    {
  12.       s = 1;
  13.       y = -y;
  14.    }
  15.  
  16.    if (y <= 32768.0)
  17.   res = (float)(long)y;
  18.  
  19.  else if (y < 10000000.0)
  20.    {
  21.   l = (long)(y/32768.0);
  22.       y = 32768.0*(y/32768.0 - (float)l);
  23.   res = 32768.0*(float)l;
  24.   res += (float)(long)y;
  25.  }
  26.  
  27.  else
  28.   res = y;
  29.  
  30.  y = y - (float)(long)y;
  31.  
  32.  if (s)
  33.   res = -res;
  34.  
  35.  if (y != 0)
  36.  {
  37.   if (s == 1 && n == 0)
  38.    res -= 1.0;
  39.  
  40.   if (s == 0 && n == 1)
  41.    res += 1.0;
  42.  }
  43.  if (x == 0)
  44.     res = 0;
  45.  
  46.  return (res);
  47. }
  48.  
  49. ////////////////////////////////////////////////////////////////////////////
  50. //      float floor(float x)
  51. ////////////////////////////////////////////////////////////////////////////
  52. // Description : rounds down the number x.
  53. // Date : N/A
  54. //
  55. float floor(float x)
  56. {
  57.    return CEIL_FLOOR(x, 0);
  58. }
  59.  
  60. ////////////////////////////////////////////////////////////////////////////
  61. //      float ceil(float x)
  62. ////////////////////////////////////////////////////////////////////////////
  63. // Description : rounds up the number x.
  64. // Date : N/A
  65. //
  66. float ceil(float x)
  67. {
  68.    return CEIL_FLOOR(x, 1);
  69. }

Como puedes ver compensa mucho mas hacer lo que comenta jeremylf  :-)
Título: Re: Aproximación
Publicado por: gera en 08 de Noviembre de 2008, 13:19:58
muy cierto, podrias hacer el casting a cualquier tipo de variable q no sea float.
Saludos!

PD: no sabia q byte fuera un tipo, yo siempre uso char para variables de un byte :P
Título: Re: Aproximación
Publicado por: MLO__ en 08 de Noviembre de 2008, 13:27:40
Hola.

byte solo es permitido en CCS  :P

Saludos
Título: Re: Aproximación
Publicado por: gera en 08 de Noviembre de 2008, 13:40:58
Claro, como int8, int16 y esos tipos menos estandar q tiene jaja. No entiendo q necesidad de crear tipos q no existen en C, si con char, int, double y todo eso alcanza. En fin, quizas yo soy medio paranoico lo q estudio informatica jeje.
saludos!
Título: Re: Aproximación
Publicado por: Marttyn en 08 de Noviembre de 2008, 15:59:54
yo la verdad siempre uso int1, int8, int16...
me resulta mas facil de leer y ademas, mas estetico y homogeneo  :mrgreen:
Título: Re: Aproximación
Publicado por: RICHI777 en 08 de Noviembre de 2008, 19:19:08
Hola, en el lenguaje C se permiten definir tipos del usuario, eso permite poner nombres mas acordes a los tipos ya definidos por el lenguaje, por ejemplo un handle de archivo normalmente es declarado como FHandle esto no es otra cosa que un *int. La forma de declarar un nuevo tipo es la siguiente:

typdef <tipo> <nuevo tipo>

Para el caso del FHandle es:
typedef *int FHandle

De ahora en mas sabremos que FHandle es un puntero a int.

La idea de crear tipos es que los tipos estandares tienen un tamaño plataforma dependiente, por ejemplo para un compilador C para un micro de 8 bits el int normalmente es un entero signeado de 16 bits, pero para plataformas Windows es un entero signeado de 32 bits. Es notoria la diferencia del código generado para manejar matematica signeada y de 32 bits en un micrito de 8 bits ( sea cual sea la marca ) contra un entero de 8 bits asigneado. En definitiva todas estas nuevas definiciones permiten mejorar la portabilidad del código, para mi la idea es un poco sacada del Pascal que como lenguaje formal es muy superior.

Código: C
  1. typedef unsigned char byte;
  2. typedef unsigned short int word;
  3. typedef unsigned long dword;

Que se asumen normalmente como asigneados, lo que no me parece bueno es int8, int16, int32 que como estandart de facto implicarian enteros con signo pero para el CCS son asigneados.  :?

Saludos !
Título: Re: Aproximación
Publicado por: gera en 08 de Noviembre de 2008, 19:46:02
pascal superior a C? :S la verdad q no estoy en condiciones de discutirlo porq no se pascal, pero que yo sepa, la gran gran mayoria de las aplicaciones se hacen en C. Incluyendo el kernel de linux ;)
Y con el tema de las definiciones de tipos, no solo sirven para darle un "alias" a los tipos q ya existen, resulta muy util a la hora de declarar estructuras como tipos, y punteros a estructuras. Altamente util a la hora de crear estructuras dinamicas y cosas por el estilo ;)
saludos!
Título: Re: Aproximación
Publicado por: RICHI777 en 08 de Noviembre de 2008, 20:22:39
Hola Gera, la expliación la di por esto:
Citar
PD: no sabia q byte fuera un tipo, yo siempre uso char para variables de un byte

Cuando hablo de superioridad no estoy hablando de performance o cantidad total de uso, hablo a nivel formal del lenguaje digamos desde el uso semantico, C es un lenguaje potentisimo pero tambien es muy criticado por las cosas que te permite hacer sin tomar muchos recaudos, una es por ejemplo que no sea tan fuertemente tipeado como si lo es Pascal.

Saludos !
Título: Re: Aproximación
Publicado por: gera en 08 de Noviembre de 2008, 20:31:10
Claro, lo q pasa es q como ya dije no se pascal. Pero cosas como esas se arreglan con un buen habito de programador, y un compilador en modo histerico jajaja.
saludos!
Título: Re: Aproximación
Publicado por: Chenao en 10 de Noviembre de 2008, 18:55:55

Saludos

Muchas gracias por su comentarios y sus explicaciones acerca de estás funciones. Definitavamente para el que no sabe es muy complicado :D :D

Un saludo desde Pereira - Colombia