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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
i = reinterpret_cast<long>(y);   // evil floating point bit level hacking
Donne une erreur : invalide cas from type float to type long int.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.