将整数存储为浮点数

Mik*_*ers 8 c c++ floating-point int

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

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


为了澄清:

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

Oli*_*rth 9

可疑的:

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

int i = XXX;
float f;
*(int *)&f = i;
Run Code Online (Sandbox Code Playgroud)

并且依赖于这样的假设sizeof(int) == sizeof(float).

不太可疑:

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

int i = XXX;
float f;
memcpy(&f, &i, sizeof(int));
Run Code Online (Sandbox Code Playgroud)

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

安全:

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

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

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