C ++ Portable Konvertierung von Long nach Double

Ich muss lange darstellende Bits genau in ein Double konvertieren und meine Lösung soll auf verschiedene Architekturen portierbar sein (wobei es in der Lage sein soll, unter Compilern Standard zu sein, da g ++ und clang ++ ebenfalls großartig sind).

Ich schreibe eine schnelle Näherung für die Berechnung der Exp-Funktion, wie in vorgeschlagenDiese Frage beantwortet.

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

und ich benutze den vorschlag gefundenHier das lange in ein doppeltes umwandeln. Das Problem ist, dass ich unter OS X mit clang ++ und libc ++ die folgenden Ergebnisse für int-Werte in [-5, 5] erhalten habe:

0.00675211846828461
0.0183005779981613
0.0504353642463684
0.132078289985657
0.37483024597168
0.971007823944092
2.7694206237793
7.30961990356445
20.3215942382812
54.8094177246094
147.902587890625

Ich bekomme unter Ubuntu immer 0 mit clang ++ (3.4, gleiche Version) und libstd ++. Der Compiler sagt mir sogar (durch eine Warnung), dass der Umschaltvorgang problematisch sein kann, da die Länge gleich oder kleiner als der Umschaltparameter ist (was darauf hinweist, dass Longs und Doubles wahrscheinlich nicht die gleiche Größe haben).

Mache ich etwas falsch und / oder gibt es eine bessere Möglichkeit, das Problem zu lösen, wenn es so kompatibel wie möglich ist?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage