Java double
s ở định dạng IEEE-754 , do đó chúng có phân số 52 bit; giữa hai lũy thừa liền kề bất kỳ của hai (bao gồm một và không bao gồm double
lũy thừa tiếp theo), do đó sẽ có từ 2 đến lũy thừa thứ 52 khác nhau (tức là 4503599627370496 trong số đó). Ví dụ: đó là số lượng phân biệt double
giữa 0,5 được bao gồm và 1,0 bị loại trừ và chính xác là nhiều số cũng nằm giữa 1,0 được bao gồm và 2,0 bị loại trừ, v.v.
Đếm doubles
từ 0,0 đến 1,0 khó hơn làm như vậy giữa các lũy thừa của hai, vì có nhiều lũy thừa của hai được bao gồm trong phạm vi đó, và, người ta cũng vướng vào những vấn đề hóc búa về các số không chuẩn hóa. 10 trong số 11 bit của số mũ bao hàm phạm vi được đề cập, vì vậy, bao gồm cả các số không chuẩn hóa (và tôi nghĩ là một vài loại NaN
), bạn sẽ có 1024 lần số double
s nằm giữa lũy thừa của hai - 2**62
dù sao thì tổng số cũng không nhiều hơn . Không bao gồm & c không chuẩn hóa, tôi tin rằng số lượng sẽ là 1023 lần 2**52
.
Đối với một phạm vi tùy ý như "100 đến 100,1" thì càng khó hơn vì giới hạn trên không thể được biểu diễn chính xác dưới dạng a double
(không phải là bội số chính xác của bất kỳ lũy thừa nào của hai). Như một phép gần đúng tiện dụng, vì tiến trình giữa các lũy thừa của hai là tuyến tính, bạn có thể nói rằng khoảng nói trên là 0.1 / 64
khoảng giữa các lũy thừa xung quanh của hai (64 và 128), vì vậy bạn mong đợi khoảng
(0.1 / 64) * 2**52
phân biệt double
s - nói đến 7036874417766.4004
... cho hoặc lấy một hoặc hai ;-).