|
/* Алгоритм основанный на сдвигах,
причем после первых двух сдвигов "битные" сдвиги заменяются на "байтные"
так что работает быстро. Количество итераций зависит от требуемой точности,
но так как точность растет в геометрической прогрессии, то итераций нужно мало.
Чтобы получить максимальную точность при заданной разрядности "аккумулятора a",
исходное число перед циклом желательно сдвинуть почти (нужен запас для переноса)
до упора влево. */
for (i = 1, i < (зависит_от_точности)), i >>= 1) {
if (1 == 2) continue; // сдвиг на 2 бита пропускаем
b = a >> i;
a = a + b;
}
/* Пример 170/10
10101010
+ 10101010
---------
111111110 = 15,9375
+ 111111110
--------------
10000111011110 = 16,93359375
+ 10000111011110
-----------------------
1000011111111111011111 = 16,99974822998046875
10000,11111111111011111 = 16,99974822998046875
*/
E-mail: info@telesys.ru