06 octubre, 2007

Excel Reprobado por no saber multiplicar

Para aquellos que no están muy familiarizados con programación, y en especial con la aritmética del punto flotante, el resultado que da excel 2007 al ingresar en una celda =850*77.1 los podrá sorprender.

El resultado que verán en pantalla es 100,000 en lugar del valor correcto de 65,535. Este es un error de Excel que ya ha aceptado Microsoft y están trabajando en un parche para corregirlo.

Resulta que el problema no tiene que ver con la operación de multiplicación per se. De hecho Excel hace la multiplicación bien y guarda el valor correcto en memoria. El problema aparece a la hora de mostrar el resultado en pantalla.

Desde sus primeras versiones, Excel siempre ha hecho los cálculos en forma binaria (usando solo 1s y 0s). Al parecer una vez que calcula el resultado, hay una función que toma ese resultado binario y lo convierte a un "string" para mostrarlo en pantalla y es aquí donde surge el error.

Excel despliega en pantalla los valores incorrectos en 12 casos específicos. De los 9.214*10^18 valores de punto flotante que puede utilizar excel, 6 números binarios entre 65534.99999999995 y 65535 y otros 6 entre 65535.99999999995 y 65536 crean este problema, cualquier operación que de como resultado un valor en ese rango, mostrará 100,000 en pantalla. Ya que Excel redondea a 15 dígitos los valores que ingresamos en las celdas, no podemos meter estos valores directamente, pero si son el resultado de un cálculo (ya sea división o multiplicación, suma, resta, etc) entonces veremos el valor incorrecto en pantalla.

Como ejemplo pueden ver la siguiente imagen, donde en la Columna A estan los resultados de las operaciones que se muestran en la Columna C. Lo importante a notar es que al sumar o restar las celdas con los valores "incorrectos" con otra celda que nos aleje de 65535 obtenemos el resultado correcto, demostrando así que el valor en memoría es correcto y el problema esta en la función que lo convierta a "string" para la pantalla.

Aún mas podemos hacer una gráfica que contenga una de estas celdas que muestran el valor incorrecto y para nuestra sorpresa, en la gráfica vemos el valor correcto. Esto se debe a que Excel usa el valor en memoria para hacer las gráficas y no el que "ven" en la celda.

Este un clásico ejemplo de "bugs" que son relativamente difíciles de encontrar cuando desarrollamos algún programa. Hay dos razones por la cuales es difícil de encontrar: La primera es que probablemente en las pruebas unitarias y demás pruebas que corren para revisar los cálculos en Excel, son hechas con código automatizado en VBA, y el VBA ve 65,535 y no 100,000 por lo tanto no aparece como un error. El otro problema es el de las probabilidades pues sólo 12 de 18446744073709551616 números posibles binarios en punto flotante nos causan este problema. Así que la probabilidad de que aparezca es de menos del .000000000001% .}

No es un error tan grave como pareciera, pero como la mayoría de la gente usa los valores "visibles" de Excel en lugar de los valores en memoria, este puede ser un gran problema.

Lo que recomiendo es que si su banco esta utilizando Excel 2007, depositen 77.1 pesos 850 veces, si tienen suerte serán 34,465 pesos más ricos.

ACTUALIZACIÓN: Microsoft saco un parche para resolver este problema el 9 de Oct la información de soporte la pueden encontrar aquí.

My Amazon.com Wish List
Add to Technorati Favorites


No hay comentarios.: