将多个int编码为double

Fan*_*Fox 0 c++ encoding

我想用双重编码一对整数.例如,说我想传递一个函数:

foo(int a, int b)
Run Code Online (Sandbox Code Playgroud)

但相反,我想只用一个双来代表两个整数(即):

foo(double aAndB)
Run Code Online (Sandbox Code Playgroud)

目前我通过在小数位的两边有一个int(即10和15将变为10.15)然后将其转换为字符串流标记并提取这两个数字来实现.

然而,当涉及像10和10这样的数字时,这有一个明显的缺陷,即它变为10.1.

有没有办法通过一些棘手的数学方法来做到这一点,以便我可以传递一个代表2英特的双重函数?

谢谢.

Jer*_*ner 5

由于(通常)double有64位,每个int有32位,你可以认为你可以直接将这些位存储到double中,例如:

int32_t i1 = rand();
int32_t i2 = rand();
int64_t x = (((int64_t)i1)<<32) | ((int64_t)i2);
double theDouble;
memcpy(&theDouble, &x, sizeof(theDouble));
Run Code Online (Sandbox Code Playgroud)

......这样做"几乎有效".也就是说,它适用于i1和i2的许多可能值 - 但不适用于所有这些值.特别是,对于IEEE754浮点格式,指数位设置为0x7ff的任何值都将被视为指示"NaN",浮点硬件可以(并确实)将不同的NaN等效位模式转换回其首选位传递double作为参数时的NaN位模式等.

因此,在大多数情况下,将两个32位整数填充到一个double中似乎可以正常工作,但是如果使用所有可能的输入值对其进行测试,您会发现一些情况,其中值在双精度期间意外突变,并且当你再次解码它们时,它们会以不同的值出现.

当然,你可以通过小心设置double的尾数位来解决这个问题,但是每个整数只能给你26位,所以你只能存储+/- 33,554,432左右的整数值.也许这没关系,具体取决于您的使用案例.

我的建议是,找到一种不同的方式去做你想做的事情.将非浮点数据存储在浮点变量中会产生麻烦,特别是如果您希望代码完全可移植的话.