c++ - 将“__m256 with random-bits”转换为 [0, 1] 范围的浮点值
问题描述
我有一个__m256
包含随机位的值。
我想“解释”它,以获得另一个__m256
值float
在统一 [0.0f, 1.0f]
范围内的值。
计划使用:
__m256 randomBits = /* generated random bits, uniformly distribution */;
__m256 invFloatRange = _mm256_set1_ps( numeric_limits<float>::min() ); //min is a smallest increment of float precision
__m256 float01 = _mm256_mul(randomBits, invFloatRange);
//float01 is now ready to be used
问题一:
randomBits
但是,在所有位都为 1 且因此为 NAN的极少数情况下,这会导致问题吗?
我能做些什么来保护自己免受这种伤害?
我希望float01
始终是可用的数字
问题2:
使用上述方法获得 [0 到 1] 范围后,它会保持一致吗?我知道浮点数在不同幅度下具有不同的精度
解决方案
将 int32_t 重新解释为浮点数,可以
auto const one = _mm256_set1_epi32(0x7f800000);
a = _mm256_and_si256(a, _mm256_set1_epi32(0x007fffff));
a = _mm256_or_si256(a, one);
return _mm256_sub_ps(_mm256_castsi256_ps(a), _mm256_castsi256_ps(one));
and/or 序列将重用输入序列的 23 个 LSB,以在 1.0f <= a < 2.0f 之间产生均匀分布的值。然后去除 1.0f 的偏差。
推荐阅读
- mysql - Golang mysql select * 语句只返回第一个值
- github - Composer 没有收到我从 Packagist 发布的版本
- c - 阵列扫描两次?
- javascript - gapi 有时在角度 6 中未定义
- html - 当写入操作 HttpPostedFileBase[] fileName 返回 Null
- docker - 将本地目录安装到 docker(docker 卷)中的容器时出现问题。
- php - 教义:通过关系发现了一个新实体
- python - root after 不调用回调函数
- dart - 全宽按钮,如何对齐文本
- javascript - 反应导航 v2 滑动