unsigned long long
(または) 値がuint64_t
あり、それを に変換したいdouble
。double は、値と同じビット パターンを持つ必要がありlong
ます。このようにして、ダブルのビットを「手動で」設定できます。
unsigned long long bits = 1ULL;
double result = /* some magic here */ bits;
これを行う方法を探しています。
unsigned long long
(または) 値がuint64_t
あり、それを に変換したいdouble
。double は、値と同じビット パターンを持つ必要がありlong
ます。このようにして、ダブルのビットを「手動で」設定できます。
unsigned long long bits = 1ULL;
double result = /* some magic here */ bits;
これを行う方法を探しています。
これを行う移植可能な方法は次のとおりmemcpy
です (条件付きでまたは共用体を使用することもできますがreinterpret_cast
、strict-alias ルールの文字に違反するため、移植可能であるとは限りません)。
// First, static assert that the sizes are the same
memcpy(&result, &bits, sizeof(bits));
ただし、実行する前に、何をしているのか、どの浮動小数点表現が使用されているのかを正確に把握しておいてください (ただし、IEEE754 が一般的/一般的な選択です)。無限大、NaN、非正規数など、あらゆる種類の問題値を回避する必要があります。
union
とに注意してくださいreinterpret_cast<double*>(&bits)
。これらの方法はどちらも UB です。あなたができることはほとんどmemcpyだけです。
以下は、void ポインターを使用します。
unsigned long long bits = 1ULL;
void* tempPtr=(void*)&bits;
double result = *(double*)tempPtr;