Bonjour, c'est encore moi avec mes problèmes tordus Je suis en pleine période je martyrise mon pauvre gcc.
Au menu du jour, la fonction qui calcule l'inverse d'une racine carré a la sauce quake 3. L'original est en C :
1 2 3 4 5 6 7 8 9 10 11 12
| long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y; |
Voila ce que donne l'original.
Mais ici on est en C++ et ces cast mode C ne font pas propres ! j'ai donc essayé différentes chose, mais impossible de faire gober ca a mon gcc sans qu'il ne se fache :
i = reinterpret_cast<long>(y); // evil floating point bit level hacking
Donne une erreur : invalide cas from type float to type long int.
i = *reinterpret_cast<long*>(&y); // evil floating point bit level hacking
Donne quand a lui attention : déréférencement du pointeur type-punned brisera les strictes d'aliases . Il est possible de compiler quand même mais le code ne fonctionne pas.
Google ne m'aide pas beaucoups sur ce coup la. je crois qu'il ne m'aime aps ces temps-ci . . .
A noter que sans l'option de compilation -O3, le second code marche.
Partager