c ++ przenośna konwersja długich na podwójne

Muszę dokładnie przekonwertować długie reprezentujące bity na podwójne, a mój soluton powinien być przenośny do różnych architektur (będąc standardem we wszystkich kompilatorach, jako że g ++ i clang ++ też będą świetne).

Piszę szybkie przybliżenie do obliczania funkcji exp, jak sugerowano wto pytanie odpowiada.

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

i używam znalezionej sugestiitutaj przekształcić długi w podwójny. Problem, przed którym stoję, jest następujący: podczas gdy otrzymałem następujące wyniki dla wartości int w [-5, 5] w OS X z clang ++ i libc ++:

0.00675211846828461
0.0183005779981613
0.0504353642463684
0.132078289985657
0.37483024597168
0.971007823944092
2.7694206237793
7.30961990356445
20.3215942382812
54.8094177246094
147.902587890625

Zawsze otrzymuję 0 w Ubuntu z clang ++ (3.4, ta sama wersja) i libstd ++. Kompilator tam nawet mówi mi (przez ostrzeżenie), że operacja przesunięcia może być problematyczna, ponieważ długi ma rozmiar równy lub mniejszy niż parametr przesunięcia (wskazując, że długie i podwójne nie mają prawdopodobnie tego samego rozmiaru)

Czy robię coś złego i / lub czy istnieje lepszy sposób na rozwiązanie problemu, który jest tak kompatybilny, jak to możliwe?

questionAnswers(1)

yourAnswerToTheQuestion