Als ich das 21. Jahrhundert C las , kam ich zu Kapitel 6 im Abschnitt "Markieren außergewöhnlicher numerischer Werte mit NaNs" , wo die Verwendung der Bits in der Mantisse zum Speichern von willkürlichen Bitmustern und deren Verwendung als Marker oder Zeiger erläutert wird (das Buch erwähnt dies) dass WebKit diese Technik verwendet).
Ich bin mir nicht sicher, ob ich die Nützlichkeit dieser Technik verstanden habe, die ich als Hack verstehe (sie beruht darauf, dass sich die Hardware nicht um den Wert der Mantisse in einem NaN kümmert), aber ich komme aus einem Java-Hintergrund, an den ich nicht gewöhnt bin die Rauheit von C.
Hier ist das Codefragment, mit dem ein Marker in einer NaN gesetzt und gelesen wird
#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));
}
es druckt:
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
und bei JSValue.h erklärt das Webkit die Codierung, aber nicht, warum sie verwendet wird.
Was ist der Zweck dieser Technik? Sind die Vorteile von Speicherplatz / Leistung hoch genug, um seine hackige Natur auszugleichen?