Leyendo el siglo XXI C Llegué al capítulo 6 en la sección "Marcado de valores numéricos excepcionales con NaN" , donde explica el uso de los bits en la mantisa para almacenar algunos patrones de bits arbitrarios, para usarlos como marcadores o punteros (el libro menciona que WebKit usa esta técnica).
No estoy realmente seguro de haber entendido la utilidad de esta técnica, que veo como un truco (se basa en que el hardware no se preocupa por el valor de la mantisa en un NaN) sino que proviene de un fondo de Java al que no estoy acostumbrado la aspereza de C.
Aquí está el fragmento de código que establece y lee un marcador en un NaN
#include <stdio.h>
#include <math.h> //isnan
double ref;
double set_na(){
if (!ref) {
ref=0/0.;
char *cr = (char *)(&ref);
cr[2]='a';
}
return ref;
}
int is_na(double in){
if (!ref) return 0; //set_na was never called==>no NAs yet.
char *cc = (char *)(&in);
char *cr = (char *)(&ref);
for (int i=0; i< sizeof(double); i++)
if (cc[i] != cr[i]) return 0;
return 1;
}
int main(){
double x = set_na();
double y = x;
printf("Is x=set_na() NA? %i\n", is_na(x));
printf("Is x=set_na() NAN? %i\n", isnan(x));
printf("Is y=x NA? %i\n", is_na(y));
printf("Is 0/0 NA? %i\n", is_na(0/0.));
printf("Is 8 NA? %i\n", is_na(8));
}
imprime:
Is x=set_na() NA? 1
Is x=set_na() NAN? 1
Is y=x NA? 1
Is 0/0 NA? 0
Is 8 NA? 0
y en JSValue.h webkit explica la codificación, pero no por qué se usa.
¿Cuál es el propósito de esta técnica? ¿Son los beneficios del espacio / rendimiento lo suficientemente altos como para equilibrar su naturaleza agresiva?