การอ่านศตวรรษที่ 21 Cฉันมาที่บทที่ 6 ในหัวข้อ"การทำเครื่องหมายตัวเลขที่เป็นตัวเลขที่ยอดเยี่ยมกับ NaNs"ซึ่งอธิบายการใช้บิตในแมนทิสซาเพื่อเก็บรูปแบบบิตโดยพลการเพื่อใช้เป็นเครื่องหมายหรือพอยน์เตอร์ WebKit ใช้เทคนิคนี้)
ฉันไม่แน่ใจจริงๆฉันเข้าใจประโยชน์ของเทคนิคนี้ว่าฉันเห็นว่าเป็นแฮ็ค (ขึ้นอยู่กับฮาร์ดแวร์ที่ไม่สนใจคุณค่าของ mantissa ใน NaN) แต่มาจากพื้นหลัง Java ที่ฉันไม่คุ้นเคย ความหยาบของ C.
นี่คือตัวอย่างของรหัสที่ตั้งและอ่านเครื่องหมายใน 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));
}
มันพิมพ์:
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
และที่JSValue.h webkit อธิบายการเข้ารหัส แต่ไม่ใช่สาเหตุที่ใช้
จุดประสงค์ของเทคนิคนี้คืออะไร? ประโยชน์ของพื้นที่ / ประสิทธิภาพสูงพอที่จะสร้างสมดุลให้กับธรรมชาติของมันหรือไม่?