Problema de redondeo de números en coma flotante

Solo disponible en BuenasTareas
  • Páginas : 5 (1145 palabras )
  • Descarga(s) : 0
  • Publicado : 8 de diciembre de 2010
Leer documento completo
Vista previa del texto
El problema con el redondeo en números en coma flotante.
Todos nosotros sabemos acerca de números en coma flotante, tanto que llegamos a ellos cada vez que escribimos código relacionado con las matemáticas. ¿Pero nos hemos parado alguna vez a pensar que ocurre dentro de la unidad de la coma flotante y si podemos confiar en él?
Odio poner en entredicho su buen nombre pero cuando oigo historiasacerca de naves espaciales chocando, información inconsistente en estados de cuenta bancarios y pensionistas que fueron estafados (lo cual ha sucedido), comencé a darme cuenta de que hay un peligro real en el mal uso de los números de coma flotante. De hecho, cualquiera con un par de años de experiencia bajo el brazo probablemente tendrá el placer de tratar con el problema referente a la comaflotante; o ver un colega volverse loco poco a poco sobre uno.
A menudo, la causa subyacente de dicho problema recae en categorías comunes: una división entre cero o una estrecha conversión que pierde información. Otras veces sin embargo, no es tan evidente, a veces la razón es un intento inútil de un desarrollador de software redondeando un número en coma flotante.
Eso es correcto, una de lasoperaciones más básica en matemáticas, una cosa que aprendimos antes que montar en bicicleta, elude los combinados esfuerzos de los mejores ingenieros en los últimos 30 años. Claro, esto es algo intuitivamente sin sentido, ¿por qué debería de ser imposible redondear un número en coma flotante de un modo fiable?
Para entender el porqué, necesitamos comprender un poco sobre como las comas flotantesestán representadas internamente en el formato IEEE-754. La clave es reconocer que los tipos de coma no representan los números exactos. Internamente el valor no es un continuo rango de números; en vez de eso es representado como un exponente multiplicado por una serie aritmética (como por ejemplo ½1 + ½2 +…+ ½3). Esto significa que en el rango de los números de coma flotante hay lagunas; entre dosnúmeros de coma flotante cualquiera, hay una diferencia relacionada al elemento más pequeño en las series aritméticas (½3 en el ejemplo)
¿Y que es lo que ocurre si tenemos un numero que cae en dicha laguna? Bueno, el sistema deberá elegir un número en coma flotante que tenga un valor cercano. Por ejemplo, el número real ‘.37’ no puede ser representado exactamente por las series aritméticas arribadescritas, así que si quieres asignar este número a coma flotante, el valor almacenado actualmente es ‘0.370000004’. Esto puede ser visto fácilmente si escribimos un simple programa que imprima un valor de coma flotante en vez de una gran cantidad de decimales.
Notamos la diferencia entre el valor real de un número y el valor actual de la coma flotante en un error de aproximación. Este error es unapropiedad fundamental de las comas y en lo que se refiere al redondeo hay dos importantes puntos; primeramente, la aproximación puede ser por exceso o por defecto, por ejemplo, imagina que .37 está representado como .369999998 en lugar de .370000004. En segundo lugar, para un valor dado el error de aproximación no es siempre el mismo; depende de cómo fuera calculado el valor. Esto significa que nopodemos predecir si la aproximación será por exceso o por defecto en referencia al número real.
Así que, ahora que hemos visto este error aproximado, podemos empezar realmente a pensar sobre cómo funciona el redondeo. Y veremos la incompatibilidad principal. Un método de redondeo típico trabaja mirando los dígitos dados, y si está por encima o es igual al umbral, redondeamos hacia arriba, sinolo haremos hacia abajo. Pero cuando el digito del que hablamos es parte del número que contiene un error aproximado, tenemos que considerar si el error aproximado ha cambiado el valor del digito usado para redondear. Lamentablemente, no hay una manera fácil de saber esto, y esto significa que estamos aplicando un algoritmo que requiere los dígitos exactos para detectar "fronteras" de un...
tracking img