c ++ переносимое преобразование long в double

Мне нужно точно преобразовать длинные представляющие биты в двойные, и мой солютон должен быть переносимым на разные архитектуры (возможность быть стандартными для всех компиляторов, так как g ++ и clang ++ woulf тоже будут хороши).

Я пишу быстрое приближение для вычисления функции exp, как предложено вэтот вопрос отвечает.

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

и я использую найденное предложениеВот конвертировать длинное в двойной. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я получил следующие результаты для значений int в [-5, 5] под OS X с clang ++ и libc ++:

0.00675211846828461
0.0183005779981613
0.0504353642463684
0.132078289985657
0.37483024597168
0.971007823944092
2.7694206237793
7.30961990356445
20.3215942382812
54.8094177246094
147.902587890625

Я всегда получаю 0 в Ubuntu с помощью clang ++ (3.4, та же версия) и libstd ++. Там компилятор даже говорит мне (через предупреждение), что операция сдвига может быть проблематичной, поскольку long имеет размер, равный или меньший, чем параметр shift (указывая, что long и double имеют, вероятно, не одинаковый размер)

Я делаю что-то не так и / или есть ли лучший способ решить проблему как можно более совместимым?

Ответы на вопрос(1)

Ваш ответ на вопрос