Java double
имеют формат IEEE-754 , поэтому они имеют 52-битную дробь; между любыми двумя соседними степенями двойки (включая одну и double
исключая следующую), следовательно, будет от 2 до 52-й степени различных s (т. е. 4503599627370496 из них). Например, это количество различных double
s между 0,5 включенным и исключенным 1,0, и ровно столько же находится между 1,0 включенным и 2,0 исключенным и т. Д.
Подсчитать doubles
между 0,0 и 1,0 труднее, чем между степенями двойки, потому что в этот диапазон входит много степеней двойки, и, кроме того, один попадает в острые проблемы денормализованных чисел. 10 из 11 разрядов экспоненты покрывают рассматриваемый диапазон, поэтому, включая денормализованные числа (и я думаю, несколько видов NaN
), у вас будет в 1024 раза больше double
s, чем между степенями двойки - 2**62
в любом случае не больше, чем всего . Не считая денормализованного и т. Д., Я считаю, что счет будет 1023 раза 2**52
.
Для произвольного диапазона, такого как «от 100 до 100,1», это еще сложнее, потому что верхняя граница не может быть точно представлена как double
(не является точным кратным любой степени двойки). В качестве удобного приближения, поскольку прогрессия между степенями двойки линейна, вы могли бы сказать, что указанный диапазон является 0.1 / 64
th от промежутка между окружающими степенями двойки (64 и 128), поэтому вы ожидаете около
(0.1 / 64) * 2**52
отличное double
s - которое сводится к 7036874417766.4004
... плюс-минус один или два ;-).