CORDIC

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 2. října 2017; kontroly vyžadují 19 úprav .

CORDIC ( CORDIC Method z angl.  COordinate Rotation DIgital Computer  - digitální počítač pro otáčení souřadnicového systému; metoda "číslice po číslici" , Walderův algoritmus ) je iterativní metoda pro redukci přímých výpočtů složitých funkcí na provádění jednoduchých operací sčítání a posunu . .

Metoda nápad

Myšlenkou metody je zredukovat výpočet hodnot komplexních (například hyperbolických ) funkcí na sadu jednoduchých kroků - sčítání a posun.

Tento přístup je zvláště užitečný při výpočtech funkcí na zařízeních s omezenými výpočetními schopnostmi, jako jsou mikrokontroléry nebo programovatelná logická pole ( FPGA ). Navíc, protože kroky jsou stejného typu, hardwarová implementace algoritmu může být rozšířena do potrubí nebo sbalena do smyčky.

Historie

Tato metoda byla poprvé popsána v aplikaci na výpočet goniometrických funkcí a operací transformace souřadnic Jackem Walderem v roce 1956 a poté v roce 1959 . V roce 1956 předložili Akushsky a Yuditsky podobnou myšlenku pro výpočet exponenciálních a logaritmických funkcí. Zpočátku nápad blízký tomuto navrhl Henry Briggs v roce 1624 , když sestavoval tabulky logaritmů .

Tato metoda byla použita při implementaci některých druhů instrukcí s pohyblivou řádovou čárkou v matematických koprocesorech Intel , včetně 8087 [1] [2] [3] [4] [5] , 80287 [5] [6] , 80387 [5 ] [6] a až 80486 [1] , stejně jako v koprocesorech Motorola 68881 [1] [2] a 68882. To umožnilo snížit počet logických prvků (a složitost) koprocesoru.

Briggsova metoda

Obecná myšlenka metody je následující. Postupným násobením argumentu předem vybranými konstantami přibližte argument s danou přesností pro některé funkce k jedničce a pro jiné funkce k nule. Aby však hodnota samotné funkce zůstala nezměněna, je nutné současně provádět ekvivalentní akce na zvolených konstantách. Speciálním výběrem hodnot konstant je možné výrazně zjednodušit výpočet hodnot funkce.

Například Briggs vynásobil hodnotu argumentu funkce dekadického logaritmu konstantami ve tvaru: buď .

V tomto případě byla volba prvního násobitele ( ) provedena, pokud se ukázalo, že aktuální hodnota veličiny je menší než jedna, a druhého násobitele, pokud byla aktuální hodnota větší než jedna. Postupným výběrem hodnot exponentu od 1 do , kde byla maximální dovolená chyba výpočtu, Briggs snížil hodnotu na jedničku s požadovanou přesností a tím i hodnotu funkce na nulu.

Pro ekvivalenci těchto transformací je však nutné vydělit indikovanou hodnotu stejnou hodnotou současně s násobením aktuální. Ale jak víte, logaritmus podílu se rovná rozdílu mezi logaritmy čitatele a jmenovatele. Současně s násobením proudu je proto nutné odečíst dříve vypočítanou funkci logaritmu hodnoty od součinu argumentu faktorem .

Hodnoty všech konstant formuláře a lze vypočítat předem, protože jich je relativně málo. Například s přijatelnou chybou je jich jen dvanáct.

Zbývá upřesnit, že násobení konstantami tvaru a je redukováno na operace sčítání, odčítání a přenášení čárky (posun).

Proto je postup výpočtu Briggsovy logaritmické funkce redukován na operace sčítání, odčítání a desetinného posunu.

Zobecnění myšlenky Briggsovy metody na komplexní čísla provedli v polovině padesátých let Jack Walder a téměř současně s ním Akushsky a Yuditsky. To umožnilo vypočítat goniometrické funkce.

Otevírací doba

CORDIC lze použít k výpočtu řady různých funkcí. Toto vysvětlení ukazuje, jak používat CORDIC v režimu rotace pro výpočet sinusu a kosinu úhlu. Předpokládá se, že požadovaný úhel je dán v radiánech a výsledky jsou ve formátu pevných bodů . Chcete-li určit sinus nebo kosinus úhlu , souřadnice bodu y nebo x na jednotkové kružnici musí být nalezeny podle požadovaného úhlu. Pomocí CORDIC začneme vektorem :

V první iteraci se tento vektor otočí o 45° proti směru hodinových ručiček, aby se získal vektor . Postupné iterace budou otáčet vektor v jednom nebo druhém směru v klesajících krocích, dokud není dosaženo požadovaného úhlu. Hodnota i -tého kroku je arctg(1/(2 i −1 )), pro i  = 1, 2, 3, ….

Formálněji se při každé iteraci vypočítá rotace, která se provede vynásobením vektoru rotační maticí :

Rotační matice R jsou určeny vzorcem:

Pomocí následujících dvou goniometrických identit

dostaneme rotační matici:

Výraz pro otočený vektor :

kde a jsou součásti . Omezením hodnot úhlů tak, aby nabývaly hodnot, lze násobení tečnou nahradit dělením mocninou dvou, což je v digitálním počítačovém hardwaru efektivně implementováno bitovým posunem . Dostaneme výraz:

kde

a může mít hodnoty -1 nebo 1 a používá se k určení směru otáčení: pokud je úhel kladný, pak je roven 1, jinak je roven -1.

Můžeme jej iterativně ignorovat a poté jej použít, abychom získali faktor měřítka:

která se vypočítá předem a uloží do tabulky, nebo jako jediná konstanta, pokud je počet iterací pevně daný. Tuto korekci lze také provést předem změnou měřítka .

Jediným úkolem, který zbývá, je určit, zda se má při každé iteraci provést rotace ve směru nebo proti směru hodinových ručiček (zvolte hodnotu ). To se provádí sledováním velikosti rotace při každé iteraci a odečtením od požadovaného úhlu, poté zkontrolujeme, zda je kladná, pak bychom se měli otočit ve směru hodinových ručiček, nebo pokud je záporná, měli bychom se otočit proti směru hodinových ručiček, abychom se přiblížili úhlu .

Hodnoty je také nutné vypočítat předem. Ale pro malé úhly v reprezentaci pevného bodu, což umožňuje zmenšit velikost stolu.

Jak můžete vidět na obrázku výše, sinus úhlu je souřadnice y konečného vektoru a souřadnice x je hodnota kosinus.


Metoda "dvojitých iterací"

V pracích [7] a [8] bylo navrženo použít metodu "dvojitých iterací" pro výpočet funkcí arcsinX, arccosX, lnX, expX a také pro výpočet hyperbolických funkcí . Spočívá v tom, že na rozdíl od klasické metody CORDIC, kde se hodnota iteračního kroku mění POKAŽDÉ, tzn. při každé iteraci se u metody dvojitých iterací hodnota iteračního kroku opakuje dvakrát a mění se pouze po jedné iteraci. Proto se objevil zápis pro exponent pro dvojité iterace: i = 1,1,2,2,3,3... Zatímco pro běžné iterace: i =1,2,3... Metoda dvojitých iterací zaručuje konvergenci metody ve všech povolených rozsahu změn argumentů.

Zobecnění problematiky konvergence algoritmů metody CORDIC k libovolné poziční číselné soustavě se základem R, uvedené v [9] , ukázalo, že pro funkce sin, cos, arctg stačí provést (R-1) -iterace pro každou hodnotu i (i od 0 nebo 1 do n, kde n je počet číslic), tj. pro každou číslici výsledku. U funkcí ln, exp, sh, ch, arth, R by měly být provedeny iterace pro každou hodnotu i. Pro funkce arcsin a arccos by měly být provedeny 2 ⋅ (R-1) iterace na bit, tzn. pro každou hodnotu i.

U funkcí arsh, arch bude počet iterací 2R pro každé i, tzn. pro každou číslici výsledku.

Literatura

Poznámky

  1. 1 2 3 Muller Jean-Michel. Elementární funkce: Algoritmy a implementace . - 2 vydání. - Boston: Birkhäuser, 2006. - S. 134. - ISBN 978-0-8176-4372-0 . Archivováno 5. června 2011 na Wayback Machine
  2. 1 2 Rafi Nave. Implementace transcendentálních funkcí na numerickém procesoru // Mikrozpracování a mikroprogramování. - 1983. - T. 11 , č. 3-4 . — S. 221–225 .
  3. John F. Palmer, Stephen Paul Morse. Základní nátěr 8087 . - John Wiley & Sons Australia, Limited, 1984. - ISBN 9780471875697 . Archivováno 30. prosince 2016 na Wayback Machine
  4. Sklo L. Brent. Math Coprocessors: Pohled na to, co dělají a jak to dělají // Byte Magazine. - 1990. - T. 15 , č. 1 . — S. 337–348 . — ISSN 0360-5280 .
  5. 1 2 3 Pitts Jarvis. Implementace CORDIC algoritmů – jediná kompaktní rutina pro výpočet transcendentálních funkcí // Dr. Dobbs Journal. - 1990. - T. 15 , č. 10 . — S. 152–156 .
  6. 1 2 A. K. Yuen. Procesory Intel s plovoucí desetinnou čárkou // Electro/88 Conference Record. - 1988. - S. 48/5/1-7 .
  7. Hardwarová implementace elementárních funkcí technikou číslice po číslici (CORDIC) . Staženo 24. prosince 2020. Archivováno z originálu 11. ledna 2011.
  8. Baikov V.D., Smolov V.B. Hardwarová implementace elementárních funkcí v digitálním počítači . Získáno 24. prosince 2020. Archivováno z originálu 15. ledna 2011.
  9. Baikov V.D., Smolov V.B. Specializované procesory: iterativní algoritmy a struktury . Získáno 29. prosince 2020. Archivováno z originálu dne 18. července 2011.