c++ - 将 32 位无符号整数精确转换为 (-1;1) 范围内的 float

标签 c++ c algorithm cuda floating-point

根据articles like this ,一半的 float 位于区间 [-1,1] 内。您能否建议如何利用这一事实来替换 32 位无符号整数到 float 的简单转换(同时保持均匀分布)?

简单的代码:

uint32_t i = /* randomly generated */;
float f = (float)i / (1ui32<<31) - 1.0f;

这里的问题是,首先将数字 i 转换为 float,最多损失 8 个较低位的精度。只有这样,数字才会缩放到 [0;2) 间隔,然后缩放到 [-1;1) 间隔。

如果您知道的话,请建议 x86_64 CPU 或 CUDA 的 C 或 C++ 解决方案。

更新:使用 double 的解决方案适用于 x86_64,但在 CUDA 中太慢。抱歉,我没想到会有这样的回应。有什么想法如何在不使用 double 浮点的情况下实现这一点吗?

最佳答案

您可以使用 double 进行计算相反,这样您就不会丢失 uint32_t 上的任何精度。值,然后将结果分配给 float .

float f = (double)i / (1ui32<<31) - 1.0;

关于c++ - 将 32 位无符号整数精确转换为 (-1;1) 范围内的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56693225/

相关文章:

performance - Haskell 函数 nub 效率低下

algorithm - 查找二叉树的第 n 个中序节点,其中每个节点包含其子树中左节点的数量

c - 通过引用将双数组从 C 传递到 Delphi DLL

c - 如何使用字符串声明作为实际成员的表示来调用结构的成员?

c - 拼写检查算法

algorithm - 以最高分数解决拼字游戏

c++ - 使用函数指针推迟函数执行

c++ - 用回溯法解决数独问题 - C++

C++ - 包含文件太多? & 结构重定义?

c++ - MPI 实时物理