【问题标题】:Extracting digits from a float C++从浮点 C++ 中提取数字
【发布时间】:2011-12-16 17:36:02
【问题描述】:

给定double x,并假设它位于[0,1]。例如假设 x=0.3 二进制,(保留小数点后10位),表示为

x=0.0100110011...

我想编写一些 C++ 代码来提取小数点后显示的 10 位数字。也就是说我要提取整数(0100110011)_2。

现在我对位移很陌生,我对这个问题的(天真的)解决方案如下

int temp= (int) (x*(1<<10))

然后temp 二进制将有必要的 10 位数字。

这是执行上述过程的安全方法吗?或者是否有更安全/更正确的方法来做到这一点?

注意:我不希望以字符数组的形式提取数字。我特别想要一个整数(或无符号整数)。这样做的原因是在八叉树的生成中,空间中的点根据它们的位置被赋予哈希键,称为莫顿键。这些键通常存储为整数。在获得所有点的积分键后,它们将被排序。从理论上讲,这些密钥可以通过将坐标缩放到 [0,1]、提取位并交错来获得。

【问题讨论】:

标签: c++ binary floating-point bit-manipulation


【解决方案1】:

使用 memcpy 将 double 复制到 32 位数字数组中,如下所示:

unsigned int b[2]; // assume int is 32-bits
memcpy(b, &x, 8);

最高 10 位有效二进制数字位于 b[0]b[1] 中,具体取决于您的计算机是大端还是小端。

编辑:同样可以通过一些转换而不是 memcpy 来实现,但这会违反严格的别名规则。另一种方法是使用union

【讨论】:

  • OP 要求提供小数点后的 10 位数字,而不是 10 位最高有效数字。所以指数也必须考虑在内。 (但是 OP 提出的解决方案对于这项任务来说已经足够了,而不必费劲。)
【解决方案2】:

阅读:http://chrishecker.com/images/f/fb/Gdmfp.pdf

如果您能理解那篇文章告诉您的内容,您就可以推导出您正在寻找的算法。只要记住指数中的偏差因子和尾数中隐含的前导因子,其余的都应该到位。

【讨论】:

  • ack,阅读理解失败。您的幼稚解决方案也应该同样有效。无论如何,上面的文章都是很好的信息。
猜你喜欢
  • 1970-01-01
  • 2020-08-04
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
相关资源
最近更新 更多