根据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/