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
загалом . За винятком денормалізованих & c, я вважаю, що кількість буде 1023 рази 2**52
.
Для довільного діапазону, такого як "100 до 100,1", це ще складніше, тому що верхня межа не може бути точно представлена як a double
(не є точним кратним будь-якій потужності двох). Як зручне наближення, оскільки прогресія між степенями двох є лінійною, ви можете сказати, що зазначений діапазон складає 0.1 / 64
th діапазону між оточуючими степенями двох (64 і 128), тож ви очікуєте приблизно
(0.1 / 64) * 2**52
чітке double
s - яке зводиться до 7036874417766.4004
... дати або взяти один або два ;-).