我在某处听说 .9 和 1 之间的数字比 0 和 .1 之间的数字多,当将它们表示为离散的有限位时(为了便于讨论,让我们假设 32 位 float )。有人可以向我解释为什么会这样,并举例说明 0 到 .1 之间的数字无法表示,但它对应的 .9 和 1 之间的数字(通过数学加法 .9 得到)可以用 a 表示 float ?
(这与 rngs 有关,因为它们可能会偏向不同的范围。)
最佳答案
您的推理错误的基本原因是添加 0.9
不是可逆操作。但是你倒退了。 0.0 和 0.1 之间的 float 比 0.9 和 1.0 之间的 float 多。
至于如何制作无偏浮点 RNG,您应该首先生成 [1.0,2.0) 范围内的数字,然后相应地转换和缩放结果。这是可行的,因为区间 [1.0,2.0) 在整个范围内具有统一的精度(该范围内的所有数字的指数都相同)。
如果您使用的是 IEEE 单精度,其形式为:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
只需固定符号位和指数位,并使用整数的统一随机 PRNG 来填充尾数位。这同样适用于 double。
关于c - 二进制数字的离散分布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17448421/