À la lecture de 21st Century C, je suis arrivé au chapitre 6 à la section "Marquage de valeurs numériques exceptionnelles avec NaN" , où il est expliqué comment utiliser les bits de la mantisse pour stocker des motifs de bits arbitraires, pour les utiliser comme marqueurs ou pointeurs (le livre mentionne que WebKit utilise cette technique).
Je ne suis pas vraiment sûr d'avoir compris l'utilité de cette technique, que je vois comme un bidouillage (le matériel ne tient pas compte de la valeur de la mantisse dans un NaN) mais venant d'un arrière-plan Java auquel je ne suis pas habitué la rugosité de C.
Voici l'extrait de code qui définit et lit un marqueur dans 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));
}
il 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
et à JSValue.h webkit explique le codage, mais pas pourquoi il est utilisé.
Quel est le but de cette technique? Les avantages de l’espace / de la performance sont-ils suffisamment élevés pour contrebalancer sa nature rudimentaire?