如何将32位随机函数输出缩放到0 ... 1值而不会丢失精度?

时间:2012-05-12 12:40:11

标签: c++ random floating-point-precision

我目前的功能如下:

float random(){
    return (float)rand_xor128()/UINT_MAX;
}

但后来我意识到,一旦将值转换为浮点值,就会失去精度,对吧?

我应该先把它转换成双倍吗?

float random(){
    return (float)((double)rand_xor128()/UINT_MAX);
}

但是感觉不对。我该怎么办?

1 个答案:

答案 0 :(得分:0)

您希望将32位值压缩到[0,1]范围内。这要求您能够在该范围内表示2^32个不同的值。

float总共有2 ^ 32个可能的值 。换句话说,浮子永远不会做你需要的。如果你返回一个double,你可能能够做到这一点(我没有运行数字来确定它),但除此之外,你将不得不编写自己的数据类型,它确实做了什么你需要。

但是如果将该值存储到浮点数中,则会失去精度,因为它在[0,1]范围内没有足够的精度来满足您的要求。