Bonjour, c'est encore moi avec mes problèmes tordus :P 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 :
Voila ce que donne l'original.Code:
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;
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 :
Donne une erreur : invalide cas from type float to type long int.Code: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.Code:i = *reinterpret_cast<long*>(&y); // evil floating point bit level hacking
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.