close
Vážení uživatelé,
16. 8. 2020 budou služby Blog.cz a Galerie.cz ukončeny.
Děkujeme vám za společně strávené roky!
Zjistit více

Vážení uživatelé,
16. 8. 2020 budou služby Blog.cz a Galerie.cz ukončeny.
Děkujeme vám za společně strávené roky!

Matematika v robotice 7. Svět celých čísel 4.

27. června 2013 v 5:11 | Petr |  Roboti a Matematika
Hodnocení domácí úlohy z minula
Pětku mají ti, co nevymysleli nic
Čtyřku mají ti co vymysleli 127*X = ( X << 6 ) + ( X << 5 ) + ( X << 4 ) + ( X << 3 ) + ( X << 2 ) + ( X << 1 ) + X
Trojku mají ti, kteří si uvědomili, že takový výpočet je pomalejší než prosté 127 * X = 127 * X, tedy obyč. násobení
Dvojku mají ti, kteří to vyřešili tak jako já tedy 127 * X = ( X << 7 ) - X
Jedničku mají ti, kteří přišli na něco ještě lepšího.

Dostáváme se k bolestivé otázce dělení, které je pomalé a hlavním zdrojem chyb. Proto jak už jsem psal mockrát se mu snažíme vyhnout jak jenom to jde.
Především aritmetický bitový posun doprava je ekvivalentní dělení mocninou 2 takže dělit
2, 4, 8, 16, 32, 65, 128, 256, atd je velice snadné a rychlé, dokonce tak snadné a rychlé, že si můžeme dovolit akceptovat i nějakou tu drobnou chybu třeba X / 30 můžeme napsat jako X >> 5. Pokud by takto vznikla veliká chyba třeba pro X / 11 můžeme nejprve násobit a pak dělit takže X / 11 = 3 * X / 33 to je přibližně 3 * X / 32 = ( 3 * X ) >> 5 = ( X << 1 + X) >> 5
Pokud budeme nejprve násobit - je třeba si dát pozor na přetečení výsledku.
Poslední problém - je otázka zaokroulování - celočíselné dělení stejně jako bitové posuny prostě odříznou desetinnou část takže 3/4 = 0 a hotovo stejně tak 3>>2 = 0 takže pokud počítáme můj první příklad A = 3 * X / 4 je třeba zaokroulovat, což provedeme tak jak sme to dělali s reálnými čísly ve starém dobrém basicu na IQ 151

A = INT (X+0,5)
Problém je v tom co je v naší celočíselné matematice to 0,5. Nebo to zase takový problém není dělíme li 8 je 0,5 * 8 = 4 takže A = X / 8 vypočteme jako
A = (X+4) >> 3
Zkouška 5/8 = 0,625 zaokrouleno 1 .... (5+4) >>2 = 1. Takže si prosím zapamatujte jako pravidlo, že zaokrouluje se takto
Dělení 2 ( X + 1 ) >> 1
Dělení 4 ( X + 2 ) >> 2
Dělení 8 ( X + 4 ) >> 3
Dělení 16 ( X + 8 ) >> 4
Dělení 32 ( X + 16 ) >> 5
Dělení 64 ( X + 32 ) >> 6
ATD. Pokud dojde k té něšťastné události, že prostě budete muset dělit celočíselně, funkcí pro dělení, což se snadno stane třeba když nedělíte konstatntou ale proměnnou pak
X = A / B se se zaokrouhlováním počítá jako
X= ( A + ( B >> 1 ) ) DIV B
Kde jako DIV zase označuju celočíselné dělení, jestli to váš programovací jazyk rozlišuje. Jestli vám to připadá složité - tak vězte, že součty a bitové posuny jsou neměřitelně malý strojový čas navíc proti času dělení a za zlepšenou přesnost to stojí.

Pro dnešek už zbývá jenom blondýnami (i brunetami) bedlivě očekávaná rada paní Kubáčové pro novomanželky : Ženy se často stydí za "nohu sedmičku" ale na "prsa pětky" jsou hrdé - vůbec to tak neberte - každé číslo se nakonec v posteli srovná !
 

Buď první, kdo ohodnotí tento článek.

Komentáře

1 Mroks Mroks | 27. června 2013 v 6:57

Bitove posuny použivam už dávno(nám sa tiež ľahko násobí a delí mocninami 10-tak prečo to neuľahčiť procesoru...), ale zaokrlúhlovanie je pre mňa novinka. Musím ju zaradiť do repertoára. Ale aj tak sa viacej teším na EMA - tam sú mi niektoré veci nejasné.
Takže ďakujem za perfektný článok o matematike a už sa teším na pokračovanie...

2 Petr G. Petr G. | 27. června 2013 v 12:44

Perfektní článek, konečně neumřu blbý a něco užitečného si odnesu do hrobu.

3 Dalík Dalík | 27. června 2013 v 22:36

Tož kdyby to číslo bylo <128 a bylo ulozeno v 16 bitech, tak by šlo udělat
SWAP a pak odečíst číslo. Ale kdyby bylo >128, tak už by to nastavilo znaménkovej bit a bylo by asi po srandě.

4 Mroks Mroks | 9. prosince 2013 v 12:28

Skúšam postaviť "stopára(sledovač čiary)" podľa Tvojich rád v článkoch "Analógová logika 3", samozrejme v asembleri, ale na PIC-och (PIC16F877) a najlepšie v celočíselnej matematike. Teoreticky je to paráda, ale to záverečné delenie násobkov a súčtu prevrátených hodnôt (16/16 bitov- matematicka rutina delenia z Microchipu) mi to hrozne predlzuje, a to este pridem o tie desatiny(polky,stvrtiny,osminy ,...) vo vyslednej polohe ciary. Z tej rutiny viem "vydojiť" aj vysledok za desatinnou čiarkou, ale zase za cenu dalších 200 cyklov.... a to sa mi zdá zbytocne komplikované. Nemáš na to nejakú "fintu fň"???(aj dobrá rada poteší...)
OT: ako sa dajú v tomto blog-systéme sledovať komentáre k starším článkom ???

5 petr-kubac petr-kubac | 10. prosince 2013 v 10:45

[4]: Finta fň bohužel není - protože princip je v tom, že součet násobený polohou se dělí součtem (jakoby) násobeným jedničkami - tím se absolutní hodnota signálů čidel vykrátí a zbyde poloha čidla , které vidí čáru
Ke zdejšímu blogovacímu systému - nic o něm nevím krom toho, že stojí za ..... kdybych dnes zakádal blog - na těchto stránkách by to rozhodně nebylo

Komentáře jsou uzavřeny.


Aktuální články

Reklama