c++ - 从 float C++ 中提取数字

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

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

x=0.0100110011...

我想编写一些 C++ 代码来提取小数点后显示的 10 位数字。换句话说,我想提取整数 (0100110011)_2。

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

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

那么二进制的 temp 将具有必要的 10 位数字。

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

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

最佳答案

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

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

最重要的 10 位二进制数字在 b[0]b[1] 中,具体取决于您的机器是大端还是小端。

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

关于c++ - 从 float C++ 中提取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8537975/

相关文章:

c++ - 为什么我收到此错误 "invalid initialization of non-const reference of type ' A &' from an rvalue of type ' A'"

c++ - 通过引用传递,仅限子范围?

c++ - 以固定长度打印二进制整数

c++ - 是否有理由在跨平台代码中使用 C++11 的 std::int_fast32_t 或 std::int_fast16_t 而不是 int ?

c++ - 没有名字的函数

c++ - 无法读取二进制文件

list - 当不需要保留顺序时,可以编码为更少的位吗?

c++ - 如何确定 float 的上限和下限?

C - 小数字的浮点舍入

c# - 在返回 float 的方法中将结果转换为 float 会改变结果