Si chiama type punning. Interpreterà lo float
come int
. Significato, la rappresentazione del bit è esattamente copiata.
È un'operazione potenzialmente pericolosa, dal momento che alcune rappresentazioni di bit di interi in virgola mobile potrebbero essere rappresentazioni di trap come numeri interi (non il caso con IEEE-754 float e 2s complementari agli interi, sebbene).
Inoltre, potrebbe non funzionare più, a causa del comportamento non definito come da standard C. Sta violando la rigida regola dell'aliasing.
C supporta solo l'accesso a variabili di un tipo diverso tramite memcpy
.
Questo è il modo valido di serie C di scrivere l'operazione:
int y; float x = 42.0f;
memcpy(&y, &x, sizeof(x));
C99 ha aggiunto un altro modo di fare questo, utilizzando un union
:
union { int y; float x; } u = { .x = 42.0f };
int y = u.y;
Carmack non ha effettivamente scrivere l'algoritmo ; vedere la [pagina Wiki] (https://en.wikipedia.org/wiki/Fast_inverse_square_root#History_and_investigation). – DylanSp