s están en formato IEEE-754, por lo tanto tienen una fracción de 52 bits; entre dos potencias adyacentes de dos (incluida una y exclusiva de la siguiente), habrá por lo tanto 2 a la 52 potencia diferente double
s (es decir, 4503599627370496 de ellas). Por ejemplo, ese es el número de double
distintos entre 0.5 incluido y 1.0 excluido, y exactamente que muchos también se encuentran entre 1.0 incluido y 2.0 excluido, y así sucesivamente.
Contar el doubles
entre 0.0 y 1.0 es más difícil que hacerlo entre potencias de dos, porque hay muchas potencias de dos incluidas en ese rango, y, además, uno se mete en los espinosos problemas de los números desnormalizados. 10 de los 11 bits de los exponentes cubren el rango en cuestión, por lo que, incluidos los números desnormalizados (y creo que algunos tipos de NaN
), tendrías 1024 veces el double
s entre dos - no más de 2**62
en total de todos modos. Excluyendo &c desnormalizado, creo que el recuento sería 1023 veces 2**52
.
Para un rango arbitrario como "100 a 100.1" es aún más difícil porque el límite superior no se puede representar exactamente como double
(no es un múltiplo exacto de ninguna potencia de dos).Como una aproximación muy útil, ya que la progresión entre las potencias de dos es lineal, se podría decir que dicho rango es 0.1/64
º de la luz entre las potencias circundantes de dos (64 y 128), por lo que cabría esperar sobre
(0.1/64) * 2**52
distinto double
s - que viene a 7036874417766.4004
... dar o recibir uno o dos ;-).
@Alex: solo para observar, cuando escribí 100 a 100.1 escribí mal. Me refiero a 100 a 101. Básicamente, entre N y N + 1 para arbitraria N. – polygenelubricants
@Alex: así que permítanme aclarar esto: no puede haber más de '2 ** 64' posibles valores dobles (ya que es un 64 bit tipo), y aparentemente una ENORME proporción de esos valores se encuentran entre '0..1'? – polygenelubricants
@polygene, sí y sí: específicamente, alrededor de un cuarto de los posibles valores (para cualquier representación de punto flotante "normal" de cualquier base y exponente frente a fracciones de longitud) se encuentran entre 0.0 y 1.0 (otro cuarto entre 1.0 e infinito, y la mitad restante en la mitad negativa del eje real). Esencialmente, la mitad de los valores del exponente (con un sesgo normal, a medio camino dentro de su rango) representan poderes negativos de la base, por lo tanto, números <1.0. –