最好我理解要求,哈希完成所需的功能。将浮点输入重新解释为整数,应用哈希函数产生一个近似均匀分布在 [0,2^32) 中的整数,然后将该整数乘以 2^-32 以将得到的整数转换回大致均匀的浮点数分布在 [0,1] 中。一种不需要乘法的合适散列函数是 Bob Jenkin 的 mix(),可以在这里找到:http ://www.burtleburtle.net/bob/hash/doobs.html 。
要将浮点数的位重新解释为整数,反之亦然,CUDA 中有两种选择。使用内在函数,或使用 C++ 风格的重新解释强制转换:
float f;
int i;
i = __float_as_int(f);
f = __int_as_float(i);
i = reinterpret_cast<int&>(f);
f = reinterpret_cast<float&>(i);
所以作为一个独立的函数,整个过程可能看起来像这样:
/* transform float in [0,1] into a different float in [0,1] */
float scramble_float (float f)
{
unsigned int magic1 = 0x96f563ae; /* number of your choice */
unsigned int magic2 = 0xb93c7563; /* number of your choice */
unsigned int j;
j = reinterpret_cast<unsigned int &>(f);
mix (magic1, magic2, j);
return 2.3283064365386963e-10f * j;
}