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

13. června 2013 v 5:25 | Petr |  Roboti a Matematika
Minule jsem se poněkud rozkecal, nicméně ani dneska si nemohu teoretický úvod odpustit. Pokud budete chtít nahradit počítání s reálnými čísly počítáním s celými čísly a zadáte si nějaké vhodné heslo do Googlu - určitě vám vyskočí odpověď "Fixed point aritmetics" - neboli "aritmetika v pevné řádové čárce".
Až to nastudujete - zistíte, že je to primitivně jednoduché - prostě 32 bitové číslo rozdělíte tak že vyšší 3 byty jsou celá část a nejnižší byte je desetinná část a hotovo - není co řešit. Tuto variantu budeme taky probírat a nic proti ní, ale někdy je to "kanón na vrabce" a někdy naopak to vůbec neřeší váš problém.
Příklad : zadejte 15.3 V ve vaší matematice: bude to něco jako 15,3 * 256 = 3917 - absolutně zmatené číslo. Já vám poradím - kašlete na fixed point a zadávejte napětí v milivoltech - pak to bude 15 300. Není to lepší s menší možností fatální chyby ?
Proto bych si nejprve dovolil probrat počítání s celými čísly - bez fixed point aritmetiky - a až pak s ní.

Takže dáme si seznam zásad podle kterých pojedeme:
  1. Zvolte si vhodné měřítko, kdy celé číslo dostatečně přesně popíše realitu (napětí v milivoltech, vzdálenost v milimetrech úhly v desetinách stupně (kruh je 3600) atd.)
  2. Používejte datové typy s ohledem na použitou přesnost a s ohledem na možnost přetečení výsledku.
  3. Při výpočtech se nejprve násobí, pak sčítá a odčítá, a až potom se dělí.
  4. Kvůli bodu 3 a eliminaci rizika přetečení je pro mezivýsledky nutné použít větší datové typy - mějte na paměti že int16_t * int16_t = int32_t atd ...
  5. Kde je možno vyhněte se násobemí - 3 * X = X + X + X
  6. Kde je mozno používejte bitové posuvy - 3 * X = ( X << 1 ) + X
  7. Vyhýbejte se dělení jako čert kříži - místo něho používejte bitové posuny, nebo třeba místo IF ( X / 10 ) > 5 THEN piště IF X > 50 THEN ...
  8. Koeficienty v rovnicích si nastavujte tak aby dělení bitovým posuvem bylo možné. Příklad : mezi X = 3 A / 10 a X = ( 5 * A ) / 16 neboli X = ( 5 * A ) >> 4 neboli X = ( ( A << 2 ) + A + 8 ) >> 4 je rozdíl 4% v přesnosti, ale obrovský rozdíl v rychlosti výpočtu.
  9. Nezapomeňte zaokroulovat A = X >> 1 je méně přesné nez A = ( X+1 ) >> 1
Zásad je určitě ještě více, ale protože nechci aby polovina mých čtěnářů utrpěla migrénu a ta druhá krvácení do mozku - pro dnešek zase končíme. Přemýšlejte nad mými 9 body, a jestli objevíte ještě další (a pište si, že jsou ) sem s nimi do komentáře, ať si zasloužíte pochvalu od "dědka", který pochvalami rozhodně neplýtvá.

Zbývá už jenom rada paní Kubáčové pro novomanželky : Lodičky za 4999 + kabát za 6999 + šaty za 2999 + kabelka za 1999 + kadeřník za 2499 + PIN manželovy kreditky = rozvod - je vám tato rovnice jasná ?
 

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

Komentáře

1 Karel Karel | 13. června 2013 v 8:19

S tím "dědkem" jsem to myslel samozřejmě ve srandě, je to variace na známý vtip! Tak se neuraž a ze sebe dědu nedělej. Žena tvou kreditkou dle zákonů čr platit nesmí, musíš ji vyřídit vlastní, koneckonců já jsem to udělal stejně a rozveden zatím nejsem. Ale mám tedy skromnější ženu.
bod 10) by byl: stejně čekáte na data ze SPI/UART/AD a nemáte co dělat, tak proč i na AVR nepočítat přímo ve float... A s dělením si hlavu nedělám vůbec.

2 petr-kubac petr-kubac | 13. června 2013 v 10:11

[1]: Ultrazvuky dodávaly data rychlosti 320 ksps a teď mám rozdělané čidlo, které má datový tok kolem 75 ksps - to je pak jiný cvrkot, nemluvě o tom že na AVRku stojí třeba CMUCAM - analýza obrazu v reálném čase. To není jako tvoje aplikace kde se dvěma talčítky na displeji mění nastavená hodnota ;-))

3 Karel Karel | 13. června 2013 v 18:11

Uznávám že pak float je v tomto případě nevhodná, ale je na každém aby si to zkusil, stačí před výpočty ve float nahodit pin, po výpočtech shodit, připojit osciloskop a změřit si, kolik to reálně trvá, třeba to bude mnohem méně než si myslíš.
Dost znatelné urychlení programu může přinést správné řetězení podmínek, třeba když je několik AND AND AND v podmínce, tak jako první dávat vždy tu s nejmenší pravděpodobností výskytu, zbývající podmínky se pak většinou už nevyhodnocují.

Komentáře jsou uzavřeny.


Aktuální články

Reklama