Leggere 21st Century C Sono arrivato al capitolo 6 nella sezione " Contrassegna valori numerici eccezionali con NaNs ", dove spiega l'uso dei bit nella mantissa per memorizzare alcuni pattern di bit arbitrari, per utilizzarli come marker o puntatori (il libro indica che WebKit utilizza questa tecnica ).
Non sono sicuro di aver compreso l'utilità di questa tecnica, che vedo come un hack (si basa sull'hardware che non si cura del valore della mantissa in un NaN) ma che proviene da uno sfondo Java non utilizzato per la ruvidezza di C.
Questo è il frammento di codice che imposta e legge un marker in 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));
}
stampa:
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
e su JSValue.h webkit spiega la codifica, ma non perché è usata.
Qual è lo scopo di questa tecnica? I benefici dello spazio / prestazioni sono abbastanza alti da bilanciare la sua natura hackish?