Explorer, aprobado en matemáticas (con trampas ;)

Explorer es un alumno aventajado en matemáticas, que al llegar a su casa en Redmond y entregar las notas del cole llena de orgullo a Tito Bill, a diferencia de su hermano Excel, la oveja negra de la familia.

En realidad, el examen fue sencillo. Consistía en copiar y pegar en la barra de direcciones lo siguiente:

javascript:5.2-0.1

Pulsa Enter y... sí, parece fácil, pero sólo Explorer 7 acertó con el resultado. Ni Firefox (Windows y Linux), ni Opera (Windows y Linux), ni Safari (Windows), ni IceWeasel (Linux), ni Epiphany (Linux), ni Flock (Linux), ni Konqueror (Linux) fueron capaces de dar la solución correcta con exactitud...

ACTUALIZADO: Vaya por dios. El gozo de Tito Bill en un pozo. Explorer suspende como Excel, pero el muy cabrón ha sabido engañarnos mejor. Ahora le ha pillado el profe haciendo trampas y se ha caído con todo el equipo. Ya me parecía a mí raro que Explorer ganara a alguien en algo... ;)

Bueno, sí; semejante falta de precisión en las operaciones de coma flotante no lleva a ningún sitio, pero no deja de resultar curioso que, por una vez, Explorer supere en algo a toda la peña.

Visto en la lista de Full-Disclosure, donde lo presentan como "un grave error de cálculo en Firefox", con el consiguiente cabreo del personal.

Comentarios

Selecciona arriba tu forma preferida de visualizar
los comentarios y pulsa el botón para guardar tus
preferencias. Éstas sólo se recordarán para tus
próximas visitas si eres usuario registrado.

Seguro que tiene

Un error de visualización como el excel, jajaja.

Oh Dios, epiphany y los demas no calculan bien ...mmm?

Realicé la cuentas sobre Epiphany y Firefox y el resultado es:

5.1000000000000005

Inclusive el interprete de python version 2.4.4 da el mismo resultado :-(

A que se deberá el cinco final. Google es absoluto con su 5.1 :-)

epiphany == firefox == iceweasel

Es normal que Epiphany y Firefox (y IceWeasel) den el mismo resultado porque los tres utilizan Gecko.

Tal vez no haya un error de cálculo ...

Cuando escribes decimales, estos son representados por números en coma flotante. almacenan 2 valores: mantisa y exponente:

0.52 * 10^1

Este formato nos permite representar de manera muy precisa números muy grandes y muy equeños, siendo más o menos precisos en función de la cantidad de cifras de la mantisa, pero no pueden representar cualquier número decimal, sino su aproximación.

De la misma manera que si guardo el valor 2.1 en una variable entera y le sumo 1 obtendré el 3. No habiéndose cometido un error de cálculo sino de representación del valor.

De hecho, si programas en C,

float a=5.2;
float b=0.1;

Y los restas, tendrás probablemente el mismo resultado.
Para evitar este problema, en algunos lenguajes de programación y algunos sistemas (bases de datos) existen tipos "decimal" con capacidad de representar números de n cifras con m decimales.

Cosas del iee754

La de horas que habré perdido programando aplicaciones Java en las que intervenían conversiones entre float e int... (basicamente diagramas de quesitos, donde drawarcs() hay que darlos en pixels en lugar de coordenadas polares... )

A mí me sale: 5.1000000000000005.

El error es lógigo si tenemos en cuenta que hay números en coma flotante que no pueden ser representados más que de forma aproximada en notación ieee754. Con el tiempo he aprendido que si nos interesa trabajar con pocos decimales es preferible trabajar en notación fija con el viejo truco de multiplicar todo por 1000 (tantos ceros como decimales vayamos a usar) y luego al final dividir...

No estoy seguro de que este error sea comparable con el del Excel 2007. En este caso se trata de un error de redondeo; en el otro el "redondeo" es demasiado "bestia".

Realmente nos falta "cultura de coma flotante": En mis primeras épocas de Java, se me ocurrió evaluar 0/0, y pegué un brinco pensando que había pillado un error en la JVM cuando la consola me imprimió "NaN". Pardillo que es uno....

PS: en mi firefox con linux javascript:850.0*77.1 da un resultado de 65534.99999999999. Arrieritos somos y en el camino nos encontraremos

Es un error al pasar valores

Es un error al pasar valores de decimal a binario, no todos los valores en base diez pueden pasarse a base 2 con un numero exacto.

Pero entonces...

¿por qué Explorer lo hace bien?

Lo hace bien...

pero me pregunto si será la única operación que hace bien, y por casualidad.

Lo siento, yo también caigo en la tentación de los anti-microsoft.

MS Internet Explorer lo hace bien porque...

Prueba javascript:5.1000000000000005*1 en Internet Explorer y lo sabrás :p

--
nethen

IE no falla, engaña

javascript:5.1000000000000005*1

IE no falla, engaña; lo peor de todo es que engañar es lo normal.

Opinar

Los comentarios publicados en este sitio expresan sólo la opinión de su autor, quien será el único responsable de los mismos. La publicación de cualquier comentario no supone en absoluto la conformidad del responsable de este sitio con su contenido.

Como norma general, en este sitio no se publican comentarios que incluyan datos personales, ni direcciones de correo, ni ninguna otra forma de establecer contactos privados o comerciales, así como comentarios que no aportan nada, fuera de tema o que no se ajustan a la netiqueta, la ortografía o la educación.

Para poder enviar tus comentarios has de permitir las cookies del sitio.

Por favor, escribe arriba el resultado de la operación planteada. Gracias.
  • Etiquetas HTML permitidas: <a> <em> <strong> <ul> <ol> <li> <p> <u> <br><strike> <blockquote> <div>

Más información sobre las opciones de formato...