从长位加倍

时间:2013-07-01 16:20:38

标签: c++ gcc double long-integer

我有一个unsigned long long(或uint64_t)值,想要将其转换为double。 double应具有与long值相同的位模式。这样我就可以“手动”设置双重位。

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

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

3 个答案:

答案 0 :(得分:15)

执行此操作的便携式方法是使用memcpy(您也可以使用reinterpret_cast或工会有条件地执行此操作,但这些不一定是可移植的,因为它们违反了字母严格别名规则):

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

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

答案 1 :(得分:6)

谨防unionreinterpret_cast<double*>(&bits),因为这两种方法都是UB。几乎所有你能做的就是记忆。

答案 2 :(得分:-3)

以下使用void指针。

unsigned long long bits = 1ULL;
void* tempPtr=(void*)&bits;
double result = *(double*)tempPtr;