Java double
są w formacie IEEE-754 , dlatego mają ułamek 52-bitowy; między dowolnymi dwoma sąsiednimi potęgami dwóch (włączając jedną i wyłączając następną), będą zatem od 2 do 52 różnych potęg double
(tj. 4503599627370496 z nich). Na przykład jest to liczba odrębnych double
s od 0,5 uwzględnionego do 1,0 wykluczonego, a dokładnie tyle znajduje się również między 1,0 włączonym a 2,0 wykluczonym i tak dalej.
Liczenie doubles
między 0,0 a 1,0 jest trudniejsze niż robienie tego między potęgami dwójki, ponieważ w tym zakresie jest wiele potęg dwójki, a ponadto można dostać się do drażliwych kwestii zdenormalizowanych liczb. 10 z 11 bitów wykładników obejmuje omawiany zakres, więc włączając zdenormalizowane liczby (i myślę, że kilka ich rodzajów NaN
), mielibyście 1024 razy double
więcej niż s między potęgami dwóch - i tak nie więcej niż 2**62
w sumie . Nie licząc zdenormalizowanych & c, uważam, że liczba wyniosłaby 1023 razy 2**52
.
W przypadku dowolnego zakresu, takiego jak „100 do 100,1”, jest to jeszcze trudniejsze, ponieważ górnej granicy nie można dokładnie przedstawić jako a double
(nie będącej dokładną wielokrotnością żadnej potęgi dwóch). Jako przydatne przybliżenie, ponieważ progresja między potęgami dwójki jest liniowa, można powiedzieć, że wspomniany zakres jest 0.1 / 64
tym odstępem między potęgami otaczającymi dwójki (64 i 128), więc można by się spodziewać
(0.1 / 64) * 2**52
odrębne double
s - które sprowadzają się do 7036874417766.4004
... dawania lub brania jednego lub dwóch ;-).