viernes, 4 de julio de 2008

Redondeo y dolores de cabeza

5908467redondeo La clásica función Round de Delphi y las más recientes funciones RoundTo se proyectan sobre algoritmos de redondeo de la CPU y la FPU. De manera predeterminada, las CPU de Intel utilizan el redondeo bancario, que es también el tipo de redondeo que se suele encontrar en aplicaciones de hojas de cálculo.
        
El redondeo bancario se basa en la suposición de que cuando se redondean números que residen exactamente entre dos valores (10s números ,5), a1 redondearlos arriba o abajo se aumenta o reduce estadisticarnente la cantidad total (en general de capital). Por este motivo, la regla del redondeo bancario indica que 10s números ,5 deberían redondearse arriba o abajo dependiendo de que el número (sin decimales) sea impar o par. De esta manera, el redondeo se equilibrara, a1 menos estadísticamente. 

image

El ejernplo de redondeo de la figura, dernuestra el redondeo bancario y el aritmetico.

El programa tambidn utiliza otro tipo de redondeo proporcionado por la unidad Math mediante la funcion SimpleRoundTo, que utiliza un redondeo aritmktico asimetrico.

En este caso, todos 10s numeros ,5 se redondean a1 valor superior. Sin embargo, tal y como se recalca en el ejemplo de redondeo, la funcion no actua como se esperaria cuando se redondea hasta un digito decimal (es decir, cuando se pasa un segundo parametro negativo). En este caso, debido a 10s errores de representacion de 10s numeros de coma flotante, el redondeo recorta 10s valores; por ejemplo convierte 1,15 en 1,l en lugar del esperado 1.2. La solucion es multiplicar el valor por diez antes de redondear, redondearlos hasta cero digitos decimales, y despues dividirlo, como se muestra a continuacion:

(SimpleRoundTo ( d *10 , 0) / 10 )

No hay comentarios: