Los Java double
están en formato IEEE-754 , por lo que tienen una fracción de 52 bits; entre dos potencias adyacentes de dos (incluida una y excluida la siguiente), habrá 2 double
elevado a la 52 potencia s diferentes (es decir, 4503599627370496 de ellas). Por ejemplo, ese es el número de double
s distintos entre 0.5 incluido y 1.0 excluido, y exactamente ese número también se encuentra entre 1.0 incluido y 2.0 excluido, y así sucesivamente.
Contar 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 temas 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 deNaN
) tendrías 1024 veces la double
s entre potencias de dos, no más que 2**62
en total de todos modos . Excluyendo los & c desnormalizados, 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 a double
(no es un múltiplo exacto de ninguna potencia de dos). Como una práctica aproximación, dado que la progresión entre potencias de dos es lineal, se podría decir que dicho rango es0.1 / 64
el intervalo entre las potencias circundantes de dos (64 y 128), por lo que esperaría aproximadamente
(0.1 / 64) * 2**52
distintos double
s - que viene a 7036874417766.4004
... más o menos uno o dos ;-).