|
/* Àëãîðèòì îñíîâàííûé íà ñäâèãàõ,
ïðè÷åì ïîñëå ïåðâûõ äâóõ ñäâèãîâ "áèòíûå" ñäâèãè çàìåíÿþòñÿ íà "áàéòíûå"
òàê ÷òî ðàáîòàåò áûñòðî. Êîëè÷åñòâî èòåðàöèé çàâèñèò îò òðåáóåìîé òî÷íîñòè,
íî òàê êàê òî÷íîñòü ðàñòåò â ãåîìåòðè÷åñêîé ïðîãðåññèè, òî èòåðàöèé íóæíî ìàëî.
×òîáû ïîëó÷èòü ìàêñèìàëüíóþ òî÷íîñòü ïðè çàäàííîé ðàçðÿäíîñòè "àêêóìóëÿòîðà 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,9997482299804687510000,11111111111011111 = 16,99974822998046875
*/
E-mail: info@telesys.ru