Leggendo il 21 ° secolo C sono arrivato al capitolo 6 nella sezione "Contrassegnare valori numerici eccezionali con NaNs" , dove spiega l'uso dei bit nella mantissa per memorizzare alcuni schemi di bit arbitrari, per usarli come marcatori o puntatori (il libro menziona che WebKit utilizza questa tecnica).
Non sono davvero sicuro di aver compreso l'utilità di questa tecnica, che vedo come un hack (si basa sull'hardware che non si preoccupa del valore della mantissa in una NaN) ma che proviene da un background Java a cui non sono abituato la rugosità di C.
Ecco lo snippet 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 il motivo per cui viene utilizzata.
Qual è lo scopo di questa tecnica? I vantaggi di spazio / prestazioni sono abbastanza alti da bilanciare la sua natura hacker?