Převod do celočíselné aritmetiky

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Jako převod do celočíselné aritmetiky lze označit přepis výpočtu s reálnými konstantami na výpočet s konstantami celočíselnými. Jedná se metodu optimalizace, jejímž důsledkem je vznik zaokrouhlovacích chyb.

Výpočet realizovaný s čísly v plovoucí řádové čárce (FP) může být pomalejší než výpočet s čísly celými. Podstatou převodu výpočtu do celočíselné aritmetiky je náhrada násobení celého čísla reálnou konstantou v plovoucí řádové čárce za násobení tohoto čísla konstantou celočíselnou s následným dělením výsledku jinou celočíselnou konstantou. Takovým výpočtem se ovšem akumulují chyby. Protože je ovšem dělení výpočetně náročná operace, je vhodné jej nahradit bitovým posunem výsledku vpravo (dělením mocninou dvojky). V takovém případě hovoříme o aritmetice s pevnou řádovou čárkou.

Celočíselná konstanta se získá součinem původní reálné konstanty s , kde je vhodně zvolená délka posunu. Následný bitový posun vpravo odpovídá dělení touto konstantou (). Tímto posunem vznikne značná zaokrouhlovací chyba. Pokud je výpočet složen z opakovaného násobení reálnou konstantou, není vhodné provádět bitový posun vpravo po každém takovém převodu. Přesnější je provést součiny s odpovídajícími celočíselnými konstantami a nakonec provést jediný bitový posun vpravo. Délka tohoto posunu bude odpovídat celkovému součtu vynechaných posunů. Použitý celočíselný datový typ musí svým rozsahem dostačovat k uložení takto rozšířeného čísla.

Například výpočet součinu celého čísla s reálnou konstantou (v jazyce C zapsáno jako x * R) lze přepsat jako součin s celočíselnou konstantou následovaný bitovým posunem o bitů vpravo ((x * I) >> S), kde , je celočíselná konstanta a značí zaokrouhlení na nejbližší celé číslo. Se stoupající hodnotou konstanty roste přesnost výpočtu.

příklad
int a, b, c;

// výpočet s plovoucí řádovou čárkou
c = 2.7519 * a + 6.5627 * b;

// lze s rozšířením o 4 bity přepsat na
c = (44 * a + 105 * b) >> 4;

Související články[editovat | editovat zdroj]