- 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.)
- Používejte datové typy s ohledem na použitou přesnost a s ohledem na možnost přetečení výsledku.
- Při výpočtech se nejprve násobí, pak sčítá a odčítá, a až potom se dělí.
- 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 ...
- Kde je možno vyhněte se násobemí - 3 * X = X + X + X
- Kde je mozno používejte bitové posuvy - 3 * X = ( X << 1 ) + X
- 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 ...
- 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.
- Nezapomeňte zaokroulovat A = X >> 1 je méně přesné nez A = ( X+1 ) >> 1
Matematika v robotice 5. Svět celých čísel 2.
13. června 2013 v 5:25 | Petr | Roboti a MatematikaKomentáře
[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 ;-))
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.
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.