假设我有一个API,它只允许我存储浮点数或浮点数数组。但是,我想在这里存储整数值。
我(粗略地)明白,我很好的直投到2^23左右,但如果我想要更高的呢?有什么办法可以利用更多的32位浮点数,并确保我会得到相同的数字回来吗?
为求澄清:
我正在用Pixar的PRMan在点云上做一些操作。RenderMan)。我可以在预编译的点云API上使用C或C++进行链接。PRMan在任何时候都不必使用我正在存储的这些ints;我只需要在对附加到这些点的其他数据进行操作之后,将它们原封不动地交给我。
发布于 2010-11-10 23:13:17
可疑:
在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 };最后一种方法是安全的(除了一些关于浮点数和ints大小的相当合理的假设)。
发布于 2010-11-11 00:10:57
尾数字段允许存储23位。指数字段允许您存储几乎8位,它宽8位,保留了几个值。有个迹象。
避免指数中的保留值,您仍然可以存储您选择的31位。
您可能会发现frexp和ldexp很有用。
发布于 2010-11-11 00:32:28
这里给出的所有答案都假设您只想使用为浮动存储保留的字节作为存储int的位置。它们将不允许您对整数编码的浮动值执行算术。如果您想要算术工作,那么您只能使用24.99位(即范围为-(2^24-1)到(2^24-1);我认为符号位是0.99位,而不是1位,因为您不能用浮点的符号/大小表示来存储可能的最低值)和一组稀疏的较大值(例如,256的任何32位整数倍数都可以在浮点数中表示)。
https://stackoverflow.com/questions/4149992
复制相似问题