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