Os Java double
s estão no formato IEEE-754 , portanto, eles têm uma fração de 52 bits; entre quaisquer duas potências adjacentes de dois (incluindo uma e exclusiva da próxima), haverá, portanto, 2 elevado à 52ª potência double
s diferentes (ou seja, 4503599627370496 deles). Por exemplo, esse é o número de double
s distintos entre 0,5 incluídos e 1,0 excluídos, e exatamente esse número também está entre 1,0 incluído e 2,0 excluídos e assim por diante.
Contar doubles
entre 0,0 e 1,0 é mais difícil do que entre potências de dois, porque há muitas potências de dois incluídas nessa faixa e, também, entra-se nas questões espinhosas dos números desnormalizados. 10 dos 11 bits dos expoentes cobrem o intervalo em questão, então, incluindo números desnormalizados (e eu acho que alguns tipos NaN
), você teria 1024 vezes o double
s entre potências de dois - não mais do que 2**62
no total de qualquer maneira . Excluindo o desnormalizado etc., acredito que a contagem seria de 1.023 vezes 2**52
.
Para um intervalo arbitrário como "100 a 100,1" é ainda mais difícil porque o limite superior não pode ser representado exatamente como a double
(não sendo um múltiplo exato de qualquer potência de dois). Como uma aproximação útil, uma vez que a progressão entre as potências de dois é linear, você poderia dizer que o referido intervalo é o 0.1 / 64
décimo do intervalo entre as potências circundantes de dois (64 e 128), então você esperaria cerca de
(0.1 / 64) * 2**52
distinto double
s - que vem para 7036874417766.4004
... dar ou tirar um ou dois ;-).