random - 0.0 到 1.0 之间有多少个 double ?

标签 random floating-point double precision

这是我多年来一直在想的事情,但我以前从未花时间问过。

许多(伪)随机数生成器生成 0.0 到 1.0 之间的随机数。从数学上讲,此范围内有无限多个数字,但 double 是 float ,因此具有有限精度。

所以问题是:

  1. 0.0 到 1.0 之间有多少个 double 数字?
  2. 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/

相关文章:

Java Math.abs 随机与 nextInt()

java - 使用 if else 语句导致 0 的货币转换问题

matlab - 如何在不耗尽内存的情况下在 Matlab 中使用 randsample?

math - 对称级别索引算法(替代 float )的好处是什么?

java - 为什么 Double.NaN==Double.NaN 返回 false?

c++ - 是否有可能推出一个明显更快的 modf 版本

c# - 为什么使用非十进制数据类型对金钱不利?

iOS:限制数据类型 "double"的精度而不转换为 NSString

在R中反复洗牌

sorting - meteor 排序集合随机