¿Engaña lo Sexy?

Cuando regresaba a casa en el coche he estado pensando sobre las dos soluciones que he propuesto para el problema que puso Ricardo, la cuestión es ¿engaña lo sexy?.
Me explico, la primera versión que puse de la solución no era sexy, en el despacho, tengo una pizarra de esas velleda y pinte la estructura de un número de coma flotante, durante el día le eché unas miraditas pensando cómo hacerlo… en un momento  del día se me ocurrió la primera solución, la cual tras implementarla no tenía nada de sexy:


public float Solucion1(float f)
{
    Byte[] bits;
 
    bits = BitConverter.GetBytes(f);
    BitArray ba = new BitArray(bits);
    BitArray ba2 = new BitArray(32);
 
    // sign
    ba2[31] = !ba[31];
 
    // exp
    for (int i = 0; i < 8; i++)
    {
        ba2[30 – i] = ba[23 + i];
    }
 
    // mantissa
    for (int i = 0; i < 23; i++)
    {
        ba2[22 – i] = ba[i];
    }
                
    ba2.CopyTo(bits, 0);
 
    float ff = BitConverter.ToSingle(bits, 0);
    
    return ff;
}


No sé, será una apreciación mía, ó una deformación de tantos años pero hay veces que un conjunto de líneas de código me parecen sexys y esta primera solución desde luego que no lo era, de modo que al postearla puse un orgulloso LUEGO LA OPTIMIZO …

Durante la mañana de hoy, he retomado el problema y he dado con otra solución, esta desde luego a mi parecer era mucho, mucho más sexy (mi musa opina lo mismo que yo). Me gustaría conocer vuestras opiniones al respecto. La solución usa punteros, para evitar casts, desmonta un número float  usando operaciones AND, OR y desplazamiento de bits, después los reversa  y por último  monta de nuevo el float al más puro estilo de C.

Bien, de regreso, como he comentado al principio, he pensado (hay que ver lo que es capaz de pensar uno) en eso la belleza y la sensualidad del código (jeje, como suena esto) y venia recreándome en lo bonita que había quedado. En ningún caso he pensado que la primera solución fuera mala, solo que no me parecía sexy, lo cual me ha llevado a pensar en las distintas formas que hay de dar solución a los problemas y demás…  (Esto para otra discusión)

En el preciso momento de aparcar el coche, UNA DUDA me ha asaltado, ¿Y si el código SEXY no es tan eficiente como el otro? ¡¡¡¡HORRRORR!!!!!, no puede ser…

Mierda, he cenado y he tenido que comprobarlo (que le vamos a hacer) y ¿cuál ha sido el resultado?  ¿ENGAÑA LO SEXY?.

He ejecutado los dos fragmentos de código para 10000 números aleatorios y el código sexy es unos 15ms más lento que el otro.

Hummm… pero para 100000 las cosas cambian… el código sexy es unas 5 veces más rápido

Ale el debate está abierto, ya veís para un día que tiene de fiesta uno y lo dedica a pensar en estas cosas …

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *