1

我当前的功能如下:

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

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

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

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

但这感觉不是正确的做法。我该怎么做?

4

1 回答 1

0

您有一个 32 位的值,您想将其压缩到 [0,1) 范围内。这要求您能够表示2^32该范围内的不同值。

A总共float有 2^32 种可能的值。换句话说,float 永远无法满足您的需求。如果你返回一个双精度数,你也许可以做到这一点(我没有运行数字来准确确定它),但否则,你必须编写自己的数据类型,它完全符合你的需要。

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

于 2012-05-12T13:01:45.730 回答