Más de 11 años en Internet
->No hagas click en esta frase.

30 septiembre, 2008

El compilador más caro no es el mejor...

Serían las 18:00h cuando mi padre me llamo por el móvil, sabiendo que a esas horas aún no he salido del trabajo.
- Oye, que Caselles (primo de mi padre y profe de Matemáticas en la UV) tiene un problema con el ordenador, ¿puedes echarle un vistazo más tarde?
- Ok, iremos al campus de Burjassot cuando salga.

Me extrañó bastante que Caselles tuviera un problema con su PC, puesto que en antaño llegó a ser usuario de Suse Linux. Entramos a su despacho del campus y descubrí que su problema informático de máxima urgéncia era que se encontraba programando un simulador de caos (así, como suena) y en las matrices de resultado salían errores de indeterminación por nan (not a number).

Para solventarlo Caselles encontró googleando la función int isnan(double x), que básicamente devolvía si el número x es representativo o no. Su idea era tratar las variables peligrosas de la siguiente forma:
x=(isnan(x)!=0)?0:x;

Básicamente es una condición que indica que si el numero resulta ser no representable su valor sea cero. Si es representable el valor se mantiene.

La pega es que su compilador, Visual C++ 2005 de Microsoft, no es un compilador C99 estándar, por lo que la función isnan no se encuentra definida en la librería math.h (que en cambio sí que se encuentra en la mayoría de compiladores de C). Es más, esa función no existe en ninguna otra libreria de Visual C++ 2005. ¿Será debido a la dificultad de su algoritmo?

La solución que utilizamos fue sencilla, definir la función isnan:

int isnan(double x)
{
return (x!=x);
}

Lógicmente, la forma mas sencilla de ver si un número es representable es saber si es comparable con su propio valor. Pues vete a saber por que esta función, que está dentro de los estándares de C, no está definida en Microsoft Visual C++ 2005.

No hay comentarios:

Publicar un comentario