向int64_t投掷双倍,而不会丢失信息

Cast double to int64_t and back without info lost

本文关键字:信息 int64      更新时间:2023-10-16

这个问题可能已经被问过了,但我搜索了一下,找不到答案。

我正在实现一个玩具虚拟机,其中操作码的形式为:

std::tuple<int8_t, int64_t, int64_t> // instruction op1, op2

我正在尝试将双精度打包到其中一个操作数中,并在处理它时再次读取它。这不能可靠地工作。

double d = ...
auto a = static_cast<int64_t>(d);
auto b = static_cast<double>(a)
// sometimes, b != d

有没有办法将双精度的位表示打包到int64_t中,然后读回该位模式以获得与以前完全相同的双精度?

static_cast执行值转换 - 小数部分总是丢失。 memcpy就是你所追求的。

double d = ... 
int64_t a;
memcpy(&a, &d, sizeof(a));
double d2;
memcpy(&d2, &a, sizeof(d2));

不过,我可能会将操作数设置为具有doubleint64_tunion(可能还有对 VM 感兴趣的其他类型(。

使其工作的一种方法是将内存块重新解释为 int64_t/double,即执行指针强制转换:

double d = ...
auto *a = (int64_t*)&d;
auto *d2 = (double*)a;
auto b = *d2;
assert(d == b);

请注意,我们在这里都假设doubleint64_t的大小相同(64 位(。我现在不记得它是否是标准的一部分。