Autor Tema: Aproximación  (Leído 2409 veces)

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

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Aproximación
« 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
Un saludo desde Pereira - Colombia

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Aproximación
« Respuesta #1 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!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Aproximación
« Respuesta #2 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.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Aproximación
« Respuesta #3 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  :-)
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Aproximación
« Respuesta #4 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

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Aproximación
« Respuesta #5 en: 08 de Noviembre de 2008, 13:27:40 »
Hola.

byte solo es permitido en CCS  :P

Saludos
El papel lo aguanta todo

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Aproximación
« Respuesta #6 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!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Aproximación
« Respuesta #7 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:
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Aproximación
« Respuesta #8 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 !

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Aproximación
« Respuesta #9 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!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Aproximación
« Respuesta #10 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 !

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Aproximación
« Respuesta #11 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!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Aproximación
« Respuesta #12 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
Un saludo desde Pereira - Colombia