6

unsigned long long(または) 値がuint64_tあり、それを に変換したいdouble。double は、値と同じビット パターンを持つ必要がありlongます。このようにして、ダブルのビットを「手動で」設定できます。

unsigned long long bits = 1ULL;
double result = /* some magic here */ bits;

これを行う方法を探しています。

4

3 に答える 3

16

これを行う移植可能な方法は次のとおりmemcpyです (条件付きでまたは共用体を使用することもできますがreinterpret_cast、strict-alias ルールの文字に違反するため、移植可能であるとは限りません)。

// First, static assert that the sizes are the same
memcpy(&result, &bits, sizeof(bits));

ただし、実行する前に、何をしているのか、どの浮動小数点表現が使用されているのかを正確に把握しておいてください (ただし、IEEE754 が一般的/一般的な選択です)。無限大、NaN、非正規数など、あらゆる種類の問題値を回避する必要があります。

于 2013-07-01T16:28:51.893 に答える
6

unionとに注意してくださいreinterpret_cast<double*>(&bits)。これらの方法はどちらも UB です。あなたができることはほとんどmemcpyだけです。

于 2013-07-01T16:28:51.023 に答える
-3

以下は、void ポインターを使用します。

unsigned long long bits = 1ULL;
void* tempPtr=(void*)&bits;
double result = *(double*)tempPtr;
于 2013-07-01T16:29:05.237 に答える