¿Este puntero de fundición rompe la regla de alias estricta?

Esta es la implementación rápida de la raíz cuadrada inversa de 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;
}

Me di cuenta quelargo int i toma el valor desreferenciado en la direcciónlong *) deflotador y. El código realiza operaciones eni antes de almacenar el valor no referenciado en la dirección (convertir a unfloat *) dei dentroy.

¿Esto rompería la estricta regla de aliasing desdei no es el mismo tipo quey?

Creo que tal vez no, ya que el valor está desreferenciado ycopiado; por lo que las operaciones se realizan en una copia en lugar del original.

Respuestas a la pregunta(4)

Su respuesta a la pregunta