将整数存储为浮点数

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

我(大致)明白,我很好,直接投到2 ^ 23左右,但是如果我想要更高的话呢? 有没有什么方法可以利用浮动的32位更多,并确保我会得到相同的数字?


为了澄清:

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

可疑的:

在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 }; 

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

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

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

您可能会发现frexpldexp很有用。

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