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 6. Svět celých čísel 3.

20. června 2013 v 5:40 | Petr |  Roboti a Matematika
Minule jsem napsal 9 zásad celočíselné matematiky v robotech, aniž bych přitom vysvětlil hlubší smysl (jako obvykle). Takže dnes si dáme hlubší smysl a pokračování.

1. Tedy pokud počítáte jen s celými čísly jsou operace, které nezhoršují přesnost výsledku jako je násobení a sčítání / odčítání.
3 * 4 je 12 stejně jako 3.0 * 4.0 = 12.0
2. Pak je dělení, které naopak v celočíselné verzi výrazně snižuje přesnost výsledku
199 DIV 100 = 1
3. Proto musíme zaokroulovat.
(199 + 50) DIV 100 = 2
4. Navíc u celočíselných výpočtů záleží na pořadí operací.
3 * 10 / 4 = 7,5 zatímco (3 * 10) DIV 4 = 7 zatímco 3 * (10 DIV 4) = 6
matematici by řekli že celočselné dělení (mnou označené jako DIV) není asociativní a distributivní, ale to už moc smrdí školou, takže rychle dále.

Kromě naznačených problémů s přesností jsou i problémy s rychlostí výpočtu .
1. Sčítání a bitové posuny jsou nejrychlejší
2. Násobení je výrazně pomalejší a to i u procesorů s hardwarovou násobičkou jako jsou Atmely AtMega.
3. Dělení je nejpomalejší.

Z toho vychází mé oblíbené způsoby výpočtu
2*X = X+X nebo X << 1
4*X = X << 2 ( v tomto případě je X+X+X+X už výrazně pomalejší)
8*X = X << 3 ( a tak dále - myslím že násobení mocninami 2 je vám jasné)

5 * X = 4*X + X = (X << 2) + X
10 * X = 8*X + 2*X = (X << 3) + (X << 1)

A tak dále. Řeknete si - necháme tyto optimalizace kompilátoru "ten má větší hlavu". V tom případě možná odevzdáváte úspěch svého robota do rukou nějakému Indovi, který nedopsal pořádně optimalizace, protože jeho šéfík - zchudlý maharadža - strašně spěchal, protože už núúúútně potřeboval prachy.

Za domácí úkol máte spočíst bitovými posuny 127 * X.

Zbývá už jenom rada paní Kubáčové pro novomanželky : Někdy se matematickým zpracováním dat jistá informace ztratí - číslo 240 například rozhodně nemá na manžela takové účinky jako 90 + 60 + 90 žejo ....
 

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

Komentáře

1 Lenoch Lenoch | E-mail | 20. června 2013 v 11:44

10 * X =((X << 2) + X)<< 2

127 * X = (X >> 2) + C(bit 0 z X) do bitu 7 XL

2 petr-kubac petr-kubac | 20. června 2013 v 13:07

[1]: Nevím jestli v tom nemáte zmatek
mně vychází
10 * X jako ((X<<2)+X)<<1 neboli ((X*4)+X)*2

2 příklad - nerozumím vašemu zápisu

3 Vašek Vašek | 20. června 2013 v 22:08

že by 127*X=(X<<7)-X ?

Komentáře jsou uzavřeny.


Aktuální články

Reklama