1

我在某处听说 0.9 和 1 之间的数字比 0 和 .1 之间的数字要多,当它们表示为离散的有限位时(为了论证,我们假设 32 位浮点数)。有人可以向我解释为什么会这样,并举例说明 0 和 0.1 之间的数字无法表示,但其对应的 0.9 和 1 之间的数字(通过数学添加 0.9 得出)可以用 a 表示漂浮?

(这与 rngs 相关,因为它们可能偏向于不同的范围。)

4

2 回答 2

5

您的推理错误的基本原因是加法0.9不是可逆的操作。但是你有它倒退。0.0 和 0.1 之间的浮点数比 0.9 和 1.0 之间的浮点数多。

至于如何制作无偏浮点 RNG,您应该首先生成范围 [1.0,2.0) 内的数字,然后相应地转换和缩放结果。这是有效的,因为区间 [1.0,2.0) 在整个范围内具有统一的精度(该范围内的所有数字的指数都相同)。

如果您使用的是 IEEE 单精度,其形式为:

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm

只需修复符号位和指数位,并使用整数的统一随机 PRNG 来填充尾数位。这同样适用于双倍。

于 2013-07-03T12:52:33.377 回答
2

浮点数在 0.0 0.1 范围内比在 0.9 1.0 之间(不是相反)多的原因很容易理解,一旦您了解浮点数使用固定数量的二进制数字作为尾数,其余的用于规模。想象一下,为了说明,我们存储十进制数字而不是二进制数字(原理相同),并假设尾数只有 2 位。然后,比如说,使用尾数“57”,我们可以在区间 [0 0.1) 中表示很多数字:0.057 0.0057 0.00057 ...(尽可能多的比例数字允许我们),等等。但是对于区间 [0.9 1),我们受到了极大的限制:实际上我们只有 10 个值(尾数“9x”,一个单刻度)。

举一个 0 到 .1 之间的数字的例子,它不能表示,但它对应的 0.9 和 1 之间的数字(通过数学添加 0.9 找到)可以用浮点数表示?

(实际上情况正好相反)。以上面的例子(尾数的两位十进制数字)为例,数字 0.0057 是可表示的,而 0.9057 是不可表示的。

于 2013-07-03T17:42:46.073 回答