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.
Je suis assez sûr que ce n'est pas un idiome parmi les programmeurs C. – nos
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
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. –