从长位加倍

pvo*_*orb 5 c++ double gcc long-integer

我有一个unsigned long long(或uint64_t)值,并希望将其转换为double.double应具有与该long值相同的位模式.这样我就可以"手动"设置双重位.

unsigned long long bits = 1ULL;
double result = /* some magic here */ bits;
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来做到这一点.

Mar*_*k B 15

这样做的便携式方法是memcpy(你也可以有条件地使用它reinterpret_cast或者一个联合,但那些不一定是可移植的,因为它们违反了严格别名规则的字母):

// First, static assert that the sizes are the same
memcpy(&result, &bits, sizeof(bits));
Run Code Online (Sandbox Code Playgroud)

但在此之前,请确保您确切知道您正在做什么以及正在使用什么浮点表示(尽管IEEE754是一种流行/常见的选择).您需要避免使用无穷大,NaN和非正规数等各种问题值.

  • 我相信标准实际上允许你在这种情况下"reinterpret_cast <double&>(bits)",因为两种类型都是标准布局,假设double不需要更严格的对齐. (2认同)

Pup*_*ppy 6

注意unionreinterpret_cast<double*>(&bits),对于这两种方法都是UB.几乎所有你能做的就是记忆.