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 ....
10 * X =((X << 2) + X)<< 2
127 * X = (X >> 2) + C(bit 0 z X) do bitu 7 XL