Raíces cuadradas


Es bien sabido que realizar raices cuadradas con el ordenador es un método lento por la necesidad en tiempo de los algoritmos conocidos que realizan dicha operación. Por ejemplo puedes probar a meterle un montón de números a la función sqrt() de la librería math.h de C/C++, y verás como le cuesta tragárselos.

Aquí presento un número mágico: 5f3759df_{16}, que se puede usar en un método recursivo de cálculo de raíces. El método converge al resultado que queremos, como podríamos hacer con otros montones de métodos que ya existen, pero lo bueno de este es que con la primera iteración ya conseguimos un resultado sorprendentemente bueno. Dejo aquí un código copiado de la wikipedia, y su artículo para más información: http://en.wikipedia.org/wiki/Fast_inverse_square_root

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 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;
}

Cuidado, que el método calcula la inversa de la raíz, no la raíz.

Anuncios
Esta entrada fue publicada en Manuales, Tutoriales y etiquetada , , , , , , . Guarda el enlace permanente.

Una respuesta a Raíces cuadradas

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s