Este artículo explora un aspecto poco conocido de los números de punto flotante: el valor NaN (Not a Number). NaN no es simplemente un error; es un valor especial definido por el estándar IEEE 754-2008 para representar resultados indefinidos o no numéricos, como la raíz cuadrada de un número negativo. Lo interesante es que los NaN de doble precisión (64 bits) tienen una parte, llamada 'payload', de 51 bits que puede ser utilizada para almacenar información adicional.
El estándar IEEE 754-2008, nacido de la necesidad de estandarizar la representación de punto flotante para asegurar la portabilidad del código, define formatos con diferentes anchos de bits (16, 32, 64, 128 bits). Dentro de estos formatos, los NaN se identifican por un patrón específico en los bits del exponente y la mantisa. Existen dos tipos de NaN: 'quiet' (qNaN) y 'signaling' (sNaN). Los sNaN pueden generar una excepción (como SIGFPE en C) para indicar un error, mientras que los qNaN se utilizan para propagar información diagnóstica. El estándar sugiere que se preserve la información contenida en los qNaN durante las operaciones.
La utilidad de este 'payload' reside en su capacidad para almacenar información adicional. En lenguajes de tipado dinámico, se puede usar para representar valores no numéricos y sus tipos de datos en tiempo de ejecución. Esto abre la puerta a soluciones creativas para representar información adicional dentro de un valor que, inherentemente, no es un número. Por ejemplo, se podría usar para indicar el tipo de dato que se esperaba en una variable no inicializada, o para transmitir información sobre el origen de un error.
Sin embargo, existen consideraciones importantes. El uso del 'payload' de NaN es una técnica no estándar y puede depender de la implementación específica del hardware y del compilador. Además, el estándar IEEE 754-2008 no prescribe un uso específico para el 'payload', por lo que su interpretación puede variar. Finalmente, es crucial recordar que el uso de NaN para almacenar información adicional puede introducir complejidad y potencialmente afectar el rendimiento del código.
