这是我多年来一直在想的事情,但我以前从未花时间问过。
许多(伪)随机数生成器生成 0.0 到 1.0 之间的随机数。从数学上讲,此范围内有无限多个数字,但 double
是 float ,因此具有有限精度。
所以问题是:
- 0.0 到 1.0 之间有多少个
double
数字? - 1 和 2 之间的数字是否一样多? 100到101之间? 10^100 到 10^100+1 之间?
注意:如果它有所不同,我对 Java 的 double
定义特别感兴趣。
最佳答案
Java double
位于 IEEE-754 中格式,因此它们有 52 位小数;因此,在任意两个相邻的 2 的幂(包括 1 次幂,不包括下一个幂)之间,将有 2 的 52 次方不同的 double(即 4503599627370496 个)。例如,这是包含 0.5 和排除 1.0 之间的不同 double
的数量,而这些数字也恰好位于包含 1.0 和排除 2.0 之间,依此类推。
计算 0.0 和 1.0 之间的 double 比计算 2 的幂数更困难,因为该范围内包含许多 2 的幂,而且,人们还会陷入以下棘手问题:非规范化数字。 11 位指数中的 10 位涵盖了所讨论的范围,因此,包括非规范化数字(我认为有几种 NaN
),您将获得 1024 倍的 double
介于 2 的幂之间——无论如何,总共不超过 2**62
。排除非规范化的 &c,我相信计数将是 2**52
的 1023 倍。
对于像“100 到 100.1”这样的任意范围,这就更难了,因为上限不能精确地表示为 double
(不是任何 2 的幂的精确倍数)。作为一个方便的近似,由于 2 的幂之间的级数是线性的,您可以说所述范围是周围 2 的幂(64 和 128)之间跨度的 0.1/64,因此您预计大约
(0.1 / 64) * 2**52
不同的double
- 等于7036874417766.4004
...给予或采取一两个;-)。
关于random - 0.0 到 1.0 之间有多少个 double ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978930/