2

long を表すビットを double に正確に変換する必要があり、ソリューションはさまざまなアーキテクチャに移植可能です (g++ や clang++ のようにコンパイラ間で標準化できることも素晴らしいことです)。

この質問の回答で提案されているように、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;
}

ここにある提案を使用して、long を double に変換しています。私が直面している問題は、clang ++ と libc ++ を使用した OS X で [-5, 5] の int 値に対して次の結果が得られたことです。

0.00675211846828461
0.0183005779981613
0.0504353642463684
0.132078289985657
0.37483024597168
0.971007823944092
2.7694206237793
7.30961990356445
20.3215942382812
54.8094177246094
147.902587890625

Ubuntuでは、clang ++(3.4、同じバージョン)とlibstd ++を使用すると常に0になります。そこのコンパイラは、(警告を通じて) long のサイズがシフト パラメーターと同じかそれ以下であるため、シフト操作に問題がある可能性があることを教えてくれます (long と double のサイズがおそらく同じではないことを示しています)。

私は何か間違ったことをしていますか、そして/または可能な限り互換性のある問題を解決するためのより良い方法はありますか?

4

1 に答える 1