>>
to bitshift. Co nieco przesuwasz w prawo, w rzeczywistości dzieli liczbę 2.
Dlatego (length >> 3)
jest length/8
(w zaokrągleniu w dół), a (length >> 6)
jest length/64
.
Take (length/8)+(length/64)
około length*(1/8+1/64)
= length*0.140625
(w przybliżeniu)
1/7 = 0.142857...
+1
na końcu mogą być podzielone na +0.5
w każdym okresie, tak że length/8
zaokrągla się najbliżej (a nie w dół), i length/64
jest również zaokrąglana do najbliższej.
Ogólnie, można łatwo przybliżona 1/y
, gdzie y = 2^n+-1
z podobnym zbliżenia bit-shift.
nieskończony geometryczny seria:
1 + x + x^2 + x^3 + ... = 1/(1 - x)
pomnożeniu przez x:
x + x^2 + x^3 + ... = x/(1 - x)
i zastępując x = 1/2^n
1/2^n + 1/2^2n + 1/2^3n + ... = (1/2^n)/(1 - 1/2^n)
1/2^n + 1/2^2n + 1/2^3n + ... = (1/2^n)/((2^n - 1)/2^n)
1/2^n + 1/2^2n + 1/2^3n + ... = 1/(2^n - 1)
Podobny jest y = 2^n - 1
.
Aby uzyskać przybliżoną wartość y = 2^n + 1
, należy zastąpić x = -1/2^n
.
- 1/2^n + 1/2^2n - 1/2^3n + ... = (-1/2^n)/(1 + 1/2^n)
1/2^n - 1/2^2n + 1/2^3n - ... = (1/2^n)/((2^n + 1)/2^n)
1/2^n - 1/2^2n + 1/2^3n - ... = 1/(2^n + 1)
Następnie wystarczy obciąć serię nieskończoną do żądanej dokładności.
Który podział jest przesunięty w prawo o 3 odpowiadający? –