Leyendo Siglo XXI C Llegué al capítulo 6 en la sección " Marcado de valores numéricos excepcionales con NaNs ", donde explica el uso de los bits en la mantisa para almacenar algunos patrones de bits arbitrarios, para usarlos como marcadores o indicadores (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) pero proviene de un fondo Java. no acostumbrado a la rugosidad 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));
}
se 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
¿Cuál es el propósito de esta técnica? ¿Son los beneficios de espacio / rendimiento lo suficientemente altos como para equilibrar su naturaleza hackish?