将整数存储为浮点数

时间:2010-11-10 23:06:36

标签: c++ c floating-point int

假设我有一个API,只允许我存储浮点数或浮点数组。但是,我想在这里存储整数值。

我(粗略地)明白我对于2 ^ 23左右的直接演员非常好,但是如果我想要更高的话呢?有什么方法可以利用浮动的32位中的更多,并确保我会得到相同的数字?


澄清:

我正在使用Pixar的PRMan(即RenderMan)对点云做一些操作。我可以用C或C ++编写链接来预编译点云API。 PRMan绝不必使用我存储的这些内容;在操作附加到点上的其他数据后,我只需要将它们完整地交还给我。

3 个答案:

答案 0 :(得分:8)

<强>可疑:

在C中,您可以执行以下操作,这可能是不安全的(由于严格别名规则):

int i = XXX;
float f;
*(int *)&f = i;

并且依赖于sizeof(int) == sizeof(float)

的假设

不太可疑:

更安全,但更长远,如下:

int i = XXX;
float f;
memcpy(&f, &i, sizeof(int));

这仍然依赖于匹配的数据类型大小。但是,上述两种情况都假设您正在使用的库的内部对数据完全没有 。例如,它不会对NaN或+/-无穷大等进行任何特殊处理。

<强>安全

沿着完全不同的思路,如果你很乐意为每个int浪费两个花车,你可以做类似的事情:

int i = XXX;
float f[2] = { (i & 0xFFFF), ((unsigned)i >> 16 };

最后一个是安全的(除了一些关于浮点数和整数的非常合理的假设)。

答案 1 :(得分:4)

尾数字段允许您存储23位。指数字段允许您存储几乎8位,它是8位宽,保留了一些值。而且有一点迹象。

避免使用指数中的保留值,您仍然可以存储31位。

您可能会发现frexpldexp有用。

答案 2 :(得分:0)

这里给出的所有答案都假设您只想将保留用于浮点存储的字节用作存储int的位置。它们不允许您对int-encoded-in-float值执行算术运算。如果你想要算术运算,你就会陷入24.99位(即 - (2 ^ 24-1)到(2 ^ 24-1)的范围;我认为符号位为0.99位而不是1位因为你不能用float的符号/幅度表示存储最低可能的值)和一组稀疏的较大值(例如浮点数表示256的任何32位整数倍)。