La era de la informatica

Wednesday, March 14, 2007

Redondeo 2

Hola de nuevo. Voy a poner la sencilla solución al problema del redondeo. En realidad en su comentario de la anterior entrada, el cremero lo respondio correctamente pero de forma muy general. Su solucion fue:

Redondeo(x) = TRUNC(x + DEC(x))

Donde DEC se queda con la parte decimal de x y TRUNC con la parte entera. Esto es correcto, pero deja abierta la incognita de encontrar una forma adecuada de quedarnos con la parte decimal y con la parte entera. Ademas, esto realmente no necesita de llamadas a funciones, en realidad se puede realizar de forma mas sencilla observando que solo nos preocupa el redondeo teniendo en cuenta el primer decimal y solo si su valor es 5 o no. Como ya dije si el valor es >=5 se redonde hacia "arriba" (el menor entero mayor o igual que x) y si es <5 se redondea hacia "abajo" (el mayor entero menor o igual que x).

Para hacer esto podemos fijarnos en las funciones matematicas mas parecidas a la descripcion dada anteriormente. La función "suelo" (floor, en ingles) coge el mayor entero menor o igual que x (redondeo hacia abajo). La función "techo" (ceiling, en ingles) devuelve el menor entero mayor o igual que x (redondeo hacia arriba)

Dicho esto y puesto que solo nos preocupa que el primer decimal sea mayor o menor que 5, podemos usar una de estas funciones, suelo o techo. La pregunta sería como hacerlo usando bien el suelo o el techo de un valor real.

Pues la forma mas sencilla sería usar la función suelo(x), por ejemplo, de esta forma:

Redondeo(x) = Suelo(x + 0.5)

Siguiendo la notación dada por El Cremero anteriormente. nos queda por tanto definir esa función Suelo, ya que puede haber muchas implementaciones... o tal vez no? En un lenguage como C se puede hacer de la forma más sencilla posible con un "casting", ya que nos interesa un número entero podemos hacer un casting a un valor entero, de forma que en C lo más sencillo, teniendo que x es un número real (float), sería hacer lo siguiente:

z = (int) (x + 0.5);

Donde z sería una variable entera que guardaría el valor del redondeo. Esto era lo más sencillo, no hacía falta complicarse como veis. Pero tiene limitaciones, como todo en informática, debido a la precisión de los números. Para ambos tipos "float" e "int" se utilizan 32 bits, pero la forma de almacenar el número es distinta, pudiendo con un "float" especificar un valor entero mayor que lo que se puede con un "int", y al hacer el casting habría un desbordamiento y el valor final no sería correcto. Esto siempre hay que tenerlo en cuenta al hacer "castings" a tipos de datos distintos al que realmente se almacena, por tanto no es recomendable hacerlo a menos que se sepa con certeza que el resultado va a ser correcto.

Si quisieramos hacer un redondeo sencillo pero sin las limitaciones del "casting" se puede hacer teniendo en cuenta la notación en coma flotante y haciendo operaciones con bits, pero eso ya sería mas complicado y dependería del tipo y el lenguage de programación que se usase.

1 Comments:

  • Ya sabes que yo soy más de "alto nivel". Yo soy un teórico, no he programado en mi vida!

    Sigue así, este blog es genial ;)

    By Blogger El Cremero, at 3:06 AM  

Post a Comment

<< Home