c - 二进制数字的离散分布?

标签 c math discrete-mathematics

我在某处听说 .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/

相关文章:

c - 一个进程是否可以在运行时更改另一个进程中的变量值?

c - 这是 weakref 的正确用法吗?

javascript - 如何找到 Canvas 上两个向量之间的 Angular ?

Javascript:将 Math.sqrt 转换为 int?

algorithm - 互质数取模序列范围的快速算法/公式

algorithm - while循环分析

c - 死锁 linux 管道

C编程用百分比生成2和4

java - 数学公式未返回正确答案

algorithm - 请向我解释以下问题的解决方案