2010-08-10 7 views
0

Possible en double:
John Carmack’s Unusual Fast Inverse Square Root (Quake III)Que signifie cet idiome C?

Je suis tombé sur ce morceau de code un blog récemment - il est du moteur Quake3. Il est destiné à calculer rapidement la racine carrée inverse en utilisant la méthode de Newton-Rhapson.

float InvSqrt (float x){ 
    float xhalf = 0.5f*x; 
    int i = *(int*)&x; 
    i = 0x5f3759df - (i>>1); 
    x = *(float*)&i; 
    x = x*(1.5f - xhalf*x*x); 
    return x; 
} 

Quelle est la raison de faire int i = *(int*)&x;? Faire int i = (int) x; donne plutôt un résultat complètement différent.

+10

Je suis assez sûr que ce n'est pas un idiome parmi les programmeurs C. – nos

+3

La conversion d'un 'float' en un' int' est radicalement différente du déréférencement d'un pointeur 'float' sur un pointeur' int'. En outre, cette méthode est beaucoup plus lente et moins précise que l'instruction x86 'rsqrtss'. – zneak

+6

Je dirais que ce n'est pas vraiment un doublon, car il demande à propos de '* (int *) & x', au lieu de la constante magique' 0x5f3759df' qui est l'objet principal de l'autre question. –

Répondre

7

int i = *(int*)&x; ne convertit pas x à un int - ce qu'il fait est d'obtenir les réels de bits de le flottant x, qui est généralement représenté comme une autre valeur de 4 octets que vous attendez. Pour référence, faire ceci est une très mauvaise idée, sauf si vous savez exactement comment les valeurs flottantes sont représentées en mémoire.

+4

C'est encore plus une mauvaise idée car la réinterprétation invoque un comportement indéfini et les rédacteurs de compilateurs modernes adorent l'optimiser. –

7

int i = *(int*)&x; dit "prendre les quatre octets qui constituent la valeur flottante x, et les traiter comme s'ils étaient un int." valeurs flottantes et valeur int sont stockés en utilisant des méthodes complètement différentes (par exemple int 4 et le flotteur 4.0 ont complètement différents modèles de bits)

2

Le nombre qui se termine par i est la valeur binaire de la représentation en virgule flottante IEEE du nombre en x. Le lien explique à quoi cela ressemble. Ce n'est pas un langage courant, c'est une astuce intelligente avant que les instructions SSE ne soient ajoutées aux processeurs x86 disponibles dans le commerce.