给定一个整数,我想在区间[0,1]中产生一个唯一的浮点数.(此号码将用作id).我发现我遇到的所有函数的问题是它们在用完整数值之前遇到重复.例如,如果f(a:int):float = 0.a那么f(16000) = 0.16和f(16001) = 0.16001.但由于它是浮点数,0.16并且0.16001可能表示相同.换句话说,我需要一个函数不仅产生唯一的数字,而且还产生唯一表示的数字(至少是C++整数域).
我知道答案取决于特定环境中整数和浮点的大小,但如果你能给出一个特定大小的例子,它仍然会有所帮助.
正如其他人指出的那样,您可以简单地将其int转换float为相同大小以获得唯一的浮点数(对于NaNand -0和一些后置过滤Inf).但是,这不符合您在[0,1]中的要求.实际上,您可以使用该关系来表示[0,1]中没有足够的浮点数来表示整数集.如果你使用double那么尾数对于32位int来说足够大,并且表达式I / (double)INT_MAX应该足够(如果你需要,显然允许无符号).
如果23位就足够了,你可以int n像这样建立一个浮点数:
float f;
*((__int32*)&f) = (0x7E<<23) | (n & 0x7FFFFF); // exponent=0x7E-0x7F=-1, fraction=n
Run Code Online (Sandbox Code Playgroud)
它将根据IEEE浮点标准将整数[0,2 ^ 23-1]映射到浮点数[0.5,1.0].
如果23位是不够的,那么您在自己引用的链接上有一个解决方案.顺便说一下,还有其他一些重要的注意事项,一定要了解所有的限制.