Převod do celočíselné aritmetiky

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

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. +more 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 2^n, kde n je vhodně zvolená délka posunu. Následný bitový posun vpravo odpovídá dělení touto konstantou (2^n). +more 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 x s reálnou konstantou R (v jazyce C zapsáno jako x * R) lze přepsat jako součin x s celočíselnou konstantou I následovaný bitovým posunem o S bitů vpravo ((x * I) >> S), kde I = \operatorname{round}(2^S R), S je celočíselná konstanta a \operatorname{round} značí zaokrouhlení na nejbližší celé číslo. Se stoupající hodnotou konstanty S 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;

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top