Hlavní navigace

Výpočet goniometrických funkcí algoritmem CORDIC

15. 6. 2006
Doba čtení: 9 minut

Sdílet

Ve čtvrté části seriálu budeme směřovat k dokončení bloku, v němž se zabýváme numerickými formáty, které používají plovoucí řádovou čárku. Dnes si podrobněji popíšeme princip algoritmu CORDIC, který je implementován v mnoha digitálních zařízeních, včetně kalkulaček, digitálních signálových procesorů a specializovaných obvodů.

Obsah

1. Úvodní informace o algoritmu CORDIC
2. Rotace vektoru r okolo počátku souřadného systému
3. Úprava vztahu rotace vektoru pro algoritmus CORDIC
4. Hodnoty úhlů, po kterých se provádí rotace
5. Výpočet funkcí sinus a kosinus pomocí algoritmu CORDIC
6. Literatura a odkazy na Internetu
7. Obsah dalšího pokračování tohoto seriálu

1. Úvodní informace o algoritmu CORDIC

V předchozí části tohoto seriálu jsme si uvedli stručné informace o algoritmu CORDIC neboli COordinate ROtation DIgital Computer. Jedná se o výpočetní metodu využívající iteraci, kterou pro účely jednoduchého a rychlého výpočtu goniometrických funkcí bez použití násobiček a děliček navrhl a zpopularizoval Jack Volder už v polovině minulého století (viz literatura uvedená v šesté kapitole). Později se ukázalo, že tuto metodu je možné po malých úpravách použít i pro výpočty dalších matematických funkcí, například arkustangenty, arkussinu, arkuskosinu, ale i pro vyčíslení délky vektoru či jeho rychlou rotaci o libovolný úhel; včetně transformace bodu či vektoru z polárních souřadnic do souřadnic kartézských. Již větší úpravy si vyžádala aplikace metody CORDIC pro výpočet hyperbolických funkcí (sinh(), cosh(), tanh()) a funkcí logaritmických, základní myšlenka a princip práce však zůstávají stejné.

Vzhledem k tomu, že se při aplikaci algoritmu CORDIC využívají pouze ty nejzákladnější matematické operace (bitový posun doleva a doprava, sčítání, odečítání a porovnání dvou hodnot), je možné CORDIC využít ve všech číslicových systémech, ve kterých je zapotřebí šetřit použitými prostředky, tj. počtem logických hradel, kapacitou obsazené paměti, možnostmi použitých čipů atd. CORDIC tak byl implementován a s úspěchem používán například v kalkulačkách, osmibitových mikrořadičích (řada Intel 8051 a Motorola 68HC11), osmibitových domácích počítačích (Atari, Sinclair ZX Spectrum atd.) a mnoha specializovaných obvodech vytvořených pomocí programovatelných polí FPGA. Zajímavá je implementace CORDICu na mikrořadičové stavebnici Basic STAMP. V největší míře však bylo CORDICu využito v některých matematických koprocesorech (FPU), protože bylo zjištěno, že některé funkční bloky zabezpečující chod CORDICu zůstávají stále stejné bez ohledu na to, jaká funkce je počítána, což do značné míry zjednodušilo (a tím pádem i zlevnilo) výrobu FPU. Samozřejmě se také snížil počet hradel nutných pro implementaci goniometrických, hyperbolických a logaritmických funkcí.

2. Rotace vektoru r okolo počátku souřadného systému

Princip práce algoritmu CORDIC vychází z vyjádření rotace vektoru o určitý úhel δ a z následné úpravy vzorce pro rotaci tak, aby se eliminovaly zbytečně složité a časově náročné multiplikativní operace. Nejprve si napišme vzorce pro hodnoty funkcí sinus a kosinus součtu dvou úhlů. Jedná se o známé středoškolské vztahy používané pro úpravu výrazů s goniometrickými funkcemi:

sin(α+β)=sin α cos β + cos α sin β
cos(α+β)=cos α cos β – sin α sin β

Jak si ukážeme o několik odstavců níže, je možné tyto vzorečky použít pro vyjádření rotace vektoru. Vektor r, kterým budeme rotovat, může být vyjádřen souřadnicemi [x0, y0], přičemž je možné provést převod z kartézských souřadnic do souřadnic polárních:

x0=r cos φ
y0=r sin φ

kde r představuje délku vektoru r a φ je úhel vektoru měřený od kladné horizontální poloosy souřadného systému. Pokud bude vektor r rotován o úhel δ, změní se koncový bod vektoru tak, že bude ležet na kružnici o stejném poloměru r, ale úhel vektoru (opět měřený od kladné horizontální poloosy) se zvětší o δ. Tuto skutečnost je možné vyjádřit vztahy:

xr=r cos (φ+δ)
yr=r sin (φ+δ)

Dále je možné rozepsat výrazy cos (φ+δ) a sin (φ+δ) podle prvních dvou uvedených vzorečků a následně zpětně dosadit za výrazy r cos φ a r sin φ původní souřadnice vektoru r, tj. x0 a y0:

xr=r (cos φ cos δ – sin φ sin δ)=x0 cos δ – y0 sin δ
yr=r (sin φ cos δ + cos φ sin δ)=x0 sin δ + y0 cos δ

Všimněte si, že se ve výsledných vztazích nevyskytuje ani hodnota r, ani úhel původního vektoru φ. To znamená, že převod na polární souřadnice pro nás byl pouze matematickou pomůckou při odvozování vzorce pro rotaci a ve skutečnosti se nebude nikdy provádět.

3. Úprava vztahu rotace vektoru pro algoritmus CORDIC

předchozí kapitole jsme si odvodili, že rotaci jakéhokoli vektoru o úhel δ je možné zapsat pomocí vztahů:

xr=x0 cos δ – y0 sin δ
yr=x0 sin δ + y0 cos δ

Pro účely algoritmu CORDIC se tento vztah dále upravuje. První úprava spočívá v tom, že se obě rovnice vydělí hodnotou cos δ, takže dostaneme vztahy:

xr /cos δ=x0 – y0 sin δ/cos δ
yr /cos δ=x0 sin δ/cos δ + y0

Pokud si uvědomíme skutečnost, že sin δ/cos δ=tan δ, můžeme pokračovat v úpravách:

xr /cos δ=x0 – y0 tan δ
yr /cos δ=y0 + x0 tan δ

a následně:

xr=cos δ(x0 – y0 tan δ)
yr=cos δ(y0 + x0 tan δ)

Nyní přichází základní myšlenka, na které je CORDIC postaven. Pokud budeme volit úhel δ takovým způsobem, aby jeho tangenta nabývala hodnot 2-i (pro i>0), je možné tangentu ve vzorci nahradit násobením zvolenou hodnotou 2-i; v tomto případě je však možné násobení nahradit jednoduchým a přitom rychlým bitovým posunem. Omezení hodnoty tangenty na zvolenou sadu hodnot však znamená, že se vektor nemůže rotovat o libovolný úhel, ale pouze o úhel odpovídající tangentě z dané sady. To však není problém, protože rotaci o libovolný úhel je možné zapsat pomocí série rotací (doprava či doleva), například:

δ=δ123+…

Vzhledem k tomu, že se parciální rotace mohou provádět v obou směrech (tj. jak doprava, tak i doleva), můžeme místo hodnoty cos δ dosadit konstantu Ki, protože platí cos δ=cos -δ. Nakonec místo tan δ přímo dosadíme mocninu dvojky 2-i a pomocí parametru di směr rotace (parametr di nabývá pouze hodnot +1 a –1):

xr=Ki (x0 – y0 di 2-i)
yr=Ki (y0 + x0 di 2-i)

Zbývá nám zjistit hodnotu konstanty Ki. Platí:

Ki=cos (arctan 2-i)=1/(1+2-2i)1/2

Limitně se součin hodnot Ki (po nekonečně mnoha iteracích) blíží k 0,6073, to znamená, že touto hodnotou bude v některých případech nutné vydělit výsledek (v jiných případech nám naopak toto zesílení při rotaci vadit nebude).

Veškerá práce algoritmu CORDIC spočívá v tom, že se nastaví počáteční souřadnice vektoru r a iterativně se provádí rotace o předem známé úhly δ1…δn tak, aby se dosáhlo požadované hodnoty rotace δ.

4. Hodnoty úhlů, po kterých se provádí rotace

Jak jsme si uvedli v předchozí kapitole, musí tangenty úhlů použitých v CORDICu splňovat podmínku tan δ=2-i. Pokud budeme veškeré výpočty provádět v prvním kvadrantu (ve skutečnosti však může počítat i ve čtvrtém kvadrantu), začíná se s úhlem 45°, tj. π/4, protože tan π/4=1. Další úhly jsou samozřejmě menší; o jaké hodnoty se konkrétně jedná, nám dá přehled následující jednoduchý program:

#include <stdio.h>
#include <math.h>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

int main(void)
{
    double tan_value=1.0;
    double delta;
    int i;
    for (i=0; i<10; i++) {
        delta=atan(tan_value)*180.0/M_PI;
        printf("%d\t%12.10f\t%12.9f\n", i+1, tan_value, delta);
        tan_value/=2.0;
    }
    return 0;
} 

Výsledek běhu předešlého programu nám ukazuje, že se hodnoty úhlů postupně zmenšují, a to vždy na více než polovinu předchozí hodnoty. Z toho také vyplývá, že jakýkoli úhel v prvním a čtvrtém kvadrantu je opravdu možné složit ze součtu těchto úhlů. Ideální by sice byly hodnoty odpovídající přesně polovině hodnoty úhlu předchozího, tj. řada úhlů 45°, 45/2°, 45/4°…, tím by se však porušila podmínka tan δ=2-i, díky níž je algoritmus CORDIC tak rychlý a přitom jednoduchý.

i       21-i             úhel δ
1       1.0000000000    45.000000000
2       0.5000000000    26.565051177
3       0.2500000000    14.036243468
4       0.1250000000     7.125016349
5       0.0625000000     3.576334375
6       0.0312500000     1.789910608
7       0.0156250000     0.895173710
8       0.0078125000     0.447614171
9       0.0039062500     0.223810500
10      0.0019531250     0.111905677 

5. Výpočet funkcí sinus a kosinus pomocí algoritmu CORDIC

Nyní si konečně na reálném příkladu ukážeme, jakým způsobem je možné algoritmus CORDIC použít pro výpočet funkcí sinus a kosinus. Nejprve jsou spočteny tabulky úhlů a hodnota druhých záporných mocnin hodnoty 2. Při implementaci CORDICu na FPU či FPGA by se tyto tabulky samozřejmě znovu nevytvářely: tabulka úhlů by byla uložena v paměti (či masce obvodu) a tabulka mocnin hodnoty 2 by se implementovala pomocí bitových posunů. Po vytvoření tabulek je již možné CORDIC spustit. Počáteční souřadnice vektoru r jsou nastaveny na hodnotu [1, 0]. Vektor je posléze v iterační smyčce rotován tak dlouho, dokud neproběhne daný počet iterací. Úhel vektoru r se přitom neustále přibližuje k zadanému úhlu δ, jelikož se v iterační smyčce adaptivně zadaný úhel buď zmenšuje či zvětšuje o hodnotu uloženou v tabulce atans[]. Výsledek, tj. hodnoty funkcí sinus a kosinus, je uložen v nových souřadnicích vektoru r (vynásobený o konstantu K), a to z toho důvodu, že vektor rotoval na jednotkové kružnici a souřadnice jakéhokoli bodu ležícího na jednotkové kružnici přímo odpovídají hodnotám sinu a kosinu úhlu tohoto bodu počítaného od kladné horizontální poloosy.

// --------------------------------------------------------
// Výpočet hodnot funkcí sin() a cos() pomocí iteračního
// algoritmu CORDIC.
// --------------------------------------------------------

#include <stdio.h>
#include <math.h>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

// maximální počet iterací při běhu algoritmu
#define MAX_ITER 10

// "zesílení" při rotacích
#define K 0.6073

// tabulka arkustangentu úhlů
double atans[MAX_ITER];

// tabulka záporných celočíselných mocnin hodnoty 2
double pows[MAX_ITER];

// naplnění tabulek atans[] a pows[]
void createTables(void)
{
    int i;
    for (i=0; i<MAX_ITER; i++) {
        double p=pow(2.0, -i);
        atans[i]=atan(p);
        pows[i]=p;
    }
}

// výpočet funkcí sin() a cos() pro zadaný úhel delta
void sincos(double delta, double *sinval, double *cosval)
{
    int i;
    double x0=1.0;                          // nastavení počátečních podmínek
    double y0=0.0;
    double xn;
    for (i=0; i<MAX_ITER; i++) {            // iterační smyčka
        if (delta<0) {                      // úhel je záporný => rotace doleva
            xn=x0+y0*pows[i];
            y0-=x0*pows[i];
            delta+=atans[i];
        }
        else {                              // úhel je kladný => rotace doprava
            xn=x0-y0*pows[i];
            y0+=x0*pows[i];
            delta-=atans[i];
        }
        x0=xn;
    }
    *sinval=y0*K;                           // opravit "zesílení" výsledku
    *cosval=x0*K;
}

int main(void)
{
    int i;
    createTables();
    for (i=0; i<=90; i++) {                 // výpočetní smyčka
        double delta;                       // úhel, ze kterého se počítá sin a cos
        double sinval;                      // vypočtené hodnoty
        double cosval;
        double sinerr;                      // absolutní chyby
        double coserr;
        delta=i*M_PI/180.0;                 // převod úhlu na radiány
        sincos(delta, &sinval, &cosval);    // výpočet sinu a kosinu
        sinerr=fabs(sinval-sin(delta));     // výpočet absolutních chyb
        coserr=fabs(cosval-cos(delta));
                                            // tisk výsledků
        printf("%02d\t%12.10f\t%12.10f\t%12.10f\t%12.10f\t%8.3f%%\t%8.3f%%\n",
                i,
                sinval, cosval,
                sinerr, coserr,
                100.0*sinerr/sinval, 100.0*coserr/cosval);
    }
    return 0;
}

// finito 

Výsledek běhu předchozího programu je zobrazen v následující tabulce. Kromě vypočtených hodnot sinů a kosinů zadaného úhlu je spočtena i absolutní a relativní chyba, přičemž je zapotřebí upozornit na to, že relativní chyba pro obě krajní hodnoty (ty by měly vyjít nulové) je poněkud zavádějící. V každém případě však výsledky běhu algoritmu pro deset iterací nejsou špatné, zvláště když si uvědomíme, že se v každé iteraci provádělo pouze několik základních operací, konkrétně dva bitové posuny a tři součty (či rozdíly).

--------------------------------------------------------------------------------------------------
vstupní   vypočtená       vypočtená       sin             cos              sin               cos
úhel    hodnota sin()   hodnota cos()   absolutní chyba absolutní chyba  rel.chyba       rel.chyba
--------------------------------------------------------------------------------------------------
00      0.0011726802    1.0000761814    0.0011726802    0.0000761814     100.000%          0.008%
01      0.0167806202    0.9999360752    0.0006717863    0.0000883801       4.003%          0.009%
02      0.0363058568    0.9994176447    0.0014063601    0.0000268177       3.874%          0.003%
03      0.0519144682    0.9987285075    0.0004214880    0.0000989728       0.812%          0.010%
04      0.0714093909    0.9975241564    0.0016529171    0.0000398938       2.315%          0.004%
05      0.0858859660    0.9963821278    0.0012697767    0.0001874297       1.478%          0.019%
06      0.1053286152    0.9945147694    0.0008001519    0.0000071260       0.760%          0.001%
07      0.1208522102    0.9927479474    0.0010171332    0.0002017957       0.842%          0.020%
08      0.1401999641    0.9902008452    0.0010268631    0.0000672235       0.732%          0.007%
09      0.1556537948    0.9878894877    0.0007806702    0.0002011471       0.502%          0.020%
10      0.1749154013    0.9846615389    0.0012672237    0.0001462141       0.724%          0.015%
11      0.1902784482    0.9818084619    0.0005305471    0.0001812785       0.279%          0.018%
12      0.2092807371    0.9779342089    0.0013690463    0.0002133919       0.654%          0.022%
13      0.2245344811    0.9745450275    0.0004165732    0.0001749627       0.186%          0.018%
14      0.2435223655    0.9699745364    0.0016004699    0.0003211899       0.657%          0.033%
15      0.2586475676    0.9660513338    0.0001714775    0.0001255075       0.066%          0.013%
16      0.2774481762    0.9608206145    0.0018108204    0.0004410814       0.653%          0.046%
17      0.2924243921    0.9563690285    0.0000526874    0.0000642725       0.018%          0.007%
18      0.3073310520    0.9516834391    0.0016859423    0.0006269228       0.549%          0.066%
19      0.3251452218    0.9457453825    0.0004229326    0.0002268069       0.130%          0.024%
20      0.3435512762    0.9392157709    0.0015311329    0.0004768498       0.446%          0.051%
21      0.3581836921    0.9337334665    0.0001842574    0.0001530400       0.051%          0.016%
22      0.3763350045    0.9265666237    0.0017284111    0.0006172309       0.459%          0.067%
23      0.3907657879    0.9205736488    0.0000346594    0.0000687953       0.009%          0.007%
24      0.4050994316    0.9143567106    0.0016372115    0.0008112530       0.404%          0.089%
25      0.4228792420    0.9062708704    0.0002609802    0.0000369167       0.062%          0.004%
26      0.4368623186    0.8996138385    0.0015088282    0.0008197922       0.345%          0.091%
27      0.4543481744    0.8909104782    0.0003576747    0.0000960460       0.079%          0.011%
28      0.4682106568    0.8837038670    0.0012609060    0.0007562742       0.269%          0.086%
29      0.4853645826    0.8743997745    0.0005549624    0.0002199326       0.114%          0.025%
30      0.4989670003    0.8667096840    0.0010329997    0.0006842803       0.207%          0.079%
31      0.5157967696    0.8568006981    0.0007586947    0.0003666026       0.147%          0.043%
32      0.5291205039    0.8486372819    0.0007987604    0.0005891857       0.151%          0.069%
33      0.5446674419    0.8387437758    0.0000284069    0.0000732079       0.005%          0.009%
34      0.5577055299    0.8301314870    0.0014873735    0.0010939144       0.267%          0.132%
35      0.5738098078    0.8190824429    0.0002333714    0.0000696014       0.041%          0.008%
36      0.5865371490    0.8100172323    0.0012481033    0.0010002379       0.213%          0.123%
37      0.6022307543    0.7984183504    0.0004157312    0.0002171596       0.069%          0.027%
38      0.6146302652    0.7889127841    0.0010312101    0.0009020305       0.168%          0.114%
39      0.6299202599    0.7767587849    0.0005998689    0.0003871766       0.095%          0.050%
40      0.6418729918    0.7669112114    0.0009146178    0.0008667682       0.142%          0.113%
41      0.6567280845    0.7542293861    0.0006690555    0.0004801942       0.102%          0.064%
42      0.6684306187    0.7438778473    0.0006999876    0.0007330218       0.105%          0.099%
43      0.6828308344    0.7306817333    0.0008324743    0.0006719683       0.122%          0.092%
44      0.6941513412    0.7199358716    0.0005070292    0.0005960713       0.073%          0.083%
45      0.7062435465    0.7080775359    0.0008632347    0.0009707547       0.122%          0.137%
46      0.7199358716    0.6941513412    0.0005960713    0.0005070292       0.083%          0.073%
47      0.7306817333    0.6828308344    0.0006719683    0.0008324743       0.092%          0.122%
48      0.7438778473    0.6684306187    0.0007330218    0.0006999876       0.099%          0.105%
49      0.7542293861    0.6567280845    0.0004801942    0.0006690555       0.064%          0.102%
50      0.7669112114    0.6418729918    0.0008667682    0.0009146178       0.113%          0.142%
51      0.7767587849    0.6299202599    0.0003871766    0.0005998689       0.050%          0.095%
52      0.7889127841    0.6146302652    0.0009020305    0.0010312101       0.114%          0.168%
53      0.7984183504    0.6022307543    0.0002171596    0.0004157312       0.027%          0.069%
54      0.8100172323    0.5865371490    0.0010002379    0.0012481033       0.123%          0.213%
55      0.8190824429    0.5738098078    0.0000696014    0.0002333714       0.008%          0.041%
56      0.8301314870    0.5577055299    0.0010939144    0.0014873735       0.132%          0.267%
57      0.8387437758    0.5446674419    0.0000732079    0.0000284069       0.009%          0.005%
58      0.8486372819    0.5291205039    0.0005891857    0.0007987604       0.069%          0.151%
59      0.8568006981    0.5157967696    0.0003666026    0.0007586947       0.043%          0.147%
60      0.8667096840    0.4989670003    0.0006842803    0.0010329997       0.079%          0.207%
61      0.8743997745    0.4853645826    0.0002199326    0.0005549624       0.025%          0.114%
62      0.8837038670    0.4682106568    0.0007562742    0.0012609060       0.086%          0.269%
63      0.8909104782    0.4543481744    0.0000960460    0.0003576747       0.011%          0.079%
64      0.8996138385    0.4368623186    0.0008197922    0.0015088282       0.091%          0.345%
65      0.9062708704    0.4228792420    0.0000369167    0.0002609802       0.004%          0.062%
66      0.9143567106    0.4050994316    0.0008112530    0.0016372115       0.089%          0.404%
67      0.9205736488    0.3907657879    0.0000687953    0.0000346594       0.007%          0.009%
68      0.9265666237    0.3763350045    0.0006172309    0.0017284111       0.067%          0.459%
69      0.9337334665    0.3581836921    0.0001530400    0.0001842574       0.016%          0.051%
70      0.9392157709    0.3435512762    0.0004768498    0.0015311329       0.051%          0.446%
71      0.9457453825    0.3251452218    0.0002268069    0.0004229326       0.024%          0.130%
72      0.9516834391    0.3073310520    0.0006269228    0.0016859423       0.066%          0.549%
73      0.9563690285    0.2924243921    0.0000642725    0.0000526874       0.007%          0.018%
74      0.9608206145    0.2774481762    0.0004410814    0.0018108204       0.046%          0.653%
75      0.9660513338    0.2586475676    0.0001255075    0.0001714775       0.013%          0.066%
76      0.9699745364    0.2435223655    0.0003211899    0.0016004699       0.033%          0.657%
77      0.9745450275    0.2245344811    0.0001749627    0.0004165732       0.018%          0.186%
78      0.9779342089    0.2092807371    0.0002133919    0.0013690463       0.022%          0.654%
79      0.9818084619    0.1902784482    0.0001812785    0.0005305471       0.018%          0.279%
80      0.9846615389    0.1749154013    0.0001462141    0.0012672237       0.015%          0.724%
81      0.9878894877    0.1556537948    0.0002011471    0.0007806702       0.020%          0.502%
82      0.9902008452    0.1401999641    0.0000672235    0.0010268631       0.007%          0.732%
83      0.9927479474    0.1208522102    0.0002017957    0.0010171332       0.020%          0.842%
84      0.9945147694    0.1053286152    0.0000071260    0.0008001519       0.001%          0.760%
85      0.9963821278    0.0858859660    0.0001874297    0.0012697767       0.019%          1.478%
86      0.9975241564    0.0714093909    0.0000398938    0.0016529171       0.004%          2.315%
87      0.9987285075    0.0519144682    0.0000989728    0.0004214880       0.010%          0.812%
88      0.9994176447    0.0363058568    0.0000268177    0.0014063601       0.003%          3.874%
89      0.9999360752    0.0167806202    0.0000883801    0.0006717863       0.009%          4.003%
90      1.0000761814    0.0011726802    0.0000761814    0.0011726802       0.008%        100.000%
-------------------------------------------------------------------------------------------------- 

root_podpora

6. Literatura a odkazy na Internetu

  1. Andraka, Ray: „A survey of CORDIC algorithms for FPGA based computers“,
    ACM, 1998
  2. Despain, A.M.:„Fourier Transform Computations Using CORDIC Iterations“,
    IEEE Transactions on Computers, Volume 23, strany 993–1001, 1974
  3. Mazenc C., Merrheim, X., Muller, J.M.: „Computing Functions Arccos and Arcsin Using CORDIC“,
    IEEE Transactions on Computers, Volume 42, strany 118–122, 1993
  4. Volder, Jack: „Binary computation algorithms for coordinate rotation and function generation“,
    Convair Report IAR-1, 1956
  5. Volder, Jack: „The CORDIC Trigonometric Computing Technique“,
    IRE Transactions on Electronic Computing, Vol EC-8, strany 330–334, 1959
  6. NVIDIA Corporation: „Floating-Point Specials on the GPU“,
    2005
  7. Grant R. Griffin: CORDIC FAQ,
    http://www.dspgu­ru.com/info/faq­s/cordic.htm
  8. Andraka Consulting Group, Inc.: What is all this CORDIC stuff anyhow?,
    http://www.an­draka.com/cor­dic.htm
  9. Cyliax Ingo: CORDIC (COordinate Rotation DIgital Computer), the swiss army knife for computing math functions…
    http://www.ee­.ualberta.ca/cou­rses/ee401/mi­croboard/cordic_CCin­k.html

7. Obsah dalšího pokračování tohoto seriálu

V následujícím pokračování tohoto seriálu si ukážeme, jakým způsobem je možné použít algoritmus CORDIC pro výpočet dalších matematických funkcí, například vyjádření hodnoty arkustangenty, převodu bodu či vektoru z kartézských souřadnic do souřadnic polárních, výpočet délky zadaného vektoru atd.

Byl pro vás článek přínosný?