首页 > 解决方案 > 将“__m256 with random-bits”转换为 [0, 1] 范围的浮点值

问题描述

我有一个__m256包含随机位的值。

我想“解释”它,以获得另一个__m256float统一 [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] 范围后,它会保持一致吗?我知道浮点数在不同幅度下具有不同的精度

标签: c++randomfloating-pointsimdavx

解决方案


将 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 的偏差。


推荐阅读