Czy ten wskaźnik rzuca złamanie ścisłej reguły aliasingu?

Jest to szybka odwrotna implementacja pierwiastka kwadratowego z Quake III Arena:

float Q_rsqrt( float number )
{
        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?
        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;
}

zauważyłem todługi int i pobiera wartość dereferenced pod adresem (rzut na along *) zpływak y. Następnie kod wykonuje operacje nai przed zapisaniem wartości dereferenced pod adresem (rzut na afloat *) zi wy.

Czy to złamałoby surową regułę aliasingui nie jest tego samego typu coy?

Myślę, że może nie, ponieważ wartość jest odreferencjonowana iskopiowane; więc operacje są wykonywane na kopii, a nie na oryginale.

questionAnswers(4)

yourAnswerToTheQuestion