c ++ conversión portátil de largo a doble

Necesito convertir con precisión los bits largos que representan a un doble y mi solución será portátil a diferentes arquitecturas (ser capaz de ser estándar en compiladores como g ++ y clang ++ también sería genial).

Estoy escribiendo una aproximación rápida para calcular la función exp como se sugiere enesta pregunta responde.

double fast_exp(double val)
{
    double result = 0;

    unsigned long temp = (unsigned long)(1512775 * val + 1072632447);
    /* to convert from long bits to double,
   but must check if they have the same size... */
    temp = temp << 32;
    memcpy(&result, &temp, sizeof(temp));

    return result;
}

y estoy usando la sugerencia encontradaaquí Convertir el largo en un doble. El problema al que me enfrento es que, si bien obtuve los siguientes resultados para los valores de int en [-5, 5] bajo OS X con clang ++ y libc ++:

0.00675211846828461
0.0183005779981613
0.0504353642463684
0.132078289985657
0.37483024597168
0.971007823944092
2.7694206237793
7.30961990356445
20.3215942382812
54.8094177246094
147.902587890625

Siempre obtengo 0 en Ubuntu con clang ++ (3.4, misma versión) y libstd ++. El compilador allí incluso me dice (a través de una advertencia) que la operación de cambio puede ser problemática ya que el largo tiene un tamaño igual o menor al del parámetro de cambio (lo que indica que los largos y los dobles probablemente no tienen el mismo tamaño)

¿Estoy haciendo algo mal y / o hay una mejor manera de resolver el problema siendo lo más compatible posible?

Respuestas a la pregunta(1)

Su respuesta a la pregunta