c ++ conversão portátil de longa para dupla

Eu preciso converter com precisão uma longa representação bits para um duplo e minha solução deve ser portável para diferentes arquiteturas (sendo capaz de ser padrão em compiladores como g ++ e clang ++ woulf ser ótimo também).

Eu estou escrevendo uma aproximação rápida para calcular a função exp como sugerido emesta pergunta 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;
}

e estou usando a sugestão encontradaAqui para converter o longo em um duplo. O problema que estou enfrentando é que, enquanto obtive os seguintes resultados para os valores int em [-5, 5] no OS X com clang ++ e libc ++:

0.00675211846828461
0.0183005779981613
0.0504353642463684
0.132078289985657
0.37483024597168
0.971007823944092
2.7694206237793
7.30961990356445
20.3215942382812
54.8094177246094
147.902587890625

Eu sempre recebo 0 no Ubuntu com clang ++ (3.4, mesma versão) e libstd ++. O compilador lá até me diz (através de um aviso) que a operação de mudança pode ser problemática, já que o longo tem tamanho igual ou menor que o parâmetro de mudança (indicando que longs e doubles não têm o mesmo tamanho provavelmente)

Estou fazendo algo errado e / ou há uma maneira melhor de resolver o problema sendo o mais compatível possível?

questionAnswers(1)

yourAnswerToTheQuestion