Bonjour, c'est encore moi avec mes problèmes tordus  Je suis en pleine période je martyrise mon pauvre gcc.
 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 :
	
	| 12
 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