首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ints存储为浮点数

将ints存储为浮点数
EN

Stack Overflow用户
提问于 2010-11-10 23:06:35
回答 3查看 4.4K关注 0票数 8

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

我(粗略地)明白,我很好的直投到2^23左右,但如果我想要更高的呢?有什么办法可以利用更多的32位浮点数,并确保我会得到相同的数字回来吗?

为求澄清:

我正在用Pixar的PRMan在点云上做一些操作。RenderMan)。我可以在预编译的点云API上使用C或C++进行链接。PRMan在任何时候都不必使用我正在存储的这些ints;我只需要在对附加到这些点的其他数据进行操作之后,将它们原封不动地交给我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-10 23:13:17

可疑:

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

代码语言:javascript
复制
int i = XXX;
float f;
*(int *)&f = i;

这依赖于sizeof(int) == sizeof(float)的假设。

较少质疑:

更安全,但更长的是,以下是:

代码语言:javascript
复制
int i = XXX;
float f;
memcpy(&f, &i, sizeof(int));

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

保险箱:

按照完全不同的思路,如果您乐于每int浪费两次浮点数,您可以这样做:

代码语言:javascript
复制
int i = XXX;
float f[2] = { (i & 0xFFFF), ((unsigned)i >> 16 };

最后一种方法是安全的(除了一些关于浮点数和ints大小的相当合理的假设)。

票数 9
EN

Stack Overflow用户

发布于 2010-11-11 00:10:57

尾数字段允许存储23位。指数字段允许您存储几乎8位,它宽8位,保留了几个值。有个迹象。

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

您可能会发现frexpldexp很有用。

票数 4
EN

Stack Overflow用户

发布于 2010-11-11 00:32:28

这里给出的所有答案都假设您只想使用为浮动存储保留的字节作为存储int的位置。它们将不允许您对整数编码的浮动值执行算术。如果您想要算术工作,那么您只能使用24.99位(即范围为-(2^24-1)到(2^24-1);我认为符号位是0.99位,而不是1位,因为您不能用浮点的符号/大小表示来存储可能的最低值)和一组稀疏的较大值(例如,256的任何32位整数倍数都可以在浮点数中表示)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4149992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档