1
L’algorithme CORDIC
Daniel PERRIN
0. Introduction.
L’algorithme CORDIC (COordinate Rotation for DIgital Computer), mis au point en
1959 par l’am´ericain Volder, permet de calculer, avec une pr´ecision fix´ee, les logarithmes
n´ep´eriens des nombres r´eels positifs (ni trop grands ni trop petits toutefois) `a partir
d’un nombre fini de valeurs suppos´ees connues de la fonction logarithme. Il repose
essentiellement sur l’´equation fonctionnelle du logarithme : ln(xy) = ln(x) + ln(y).
1. Le principe.
On fixe une pr´ecision, disons 3×10
−8
, (mais la m´ethode se g´en´eralise avec toute pr´ecision).
On va calculer tous les nombres ln(x) pour x r´eel avec, disons, 10
−1000
<x<10
1000
(au-
del`a, de toutes fa¸cons, les calculatrices usuelles consid`erent que x est nul ou infini). Les
nombres ln(x) seront calcul´es `a partir de dix valeurs approch´ees a ln(10), a
0
ln(2),
a
1
ln(1, 1), a
2
ln(1, 01), ..., a
i
ln(1 + 10
−i
), ..., a
8
ln(1 + 10
−8
). Attention, ces
valeurs sont suppos´ees calcul´ees au d´epart, par une autre m´ethode, s´erie ou int´egrale par
exemple, et elles doivent ˆetre connues avec une pr´ecision sup´erieure `a10
−8
, voir plus bas.
Le principe de la m´ethode est de se ramener au cas 1 <x<10 puis d’encadrer 10/x :
y ≤
10
x
≤ y (1 + 10
−8
),
avec un y de la forme
y =2
α
0
(1, 1)
α
1
(1, 01)
α
2
···(1 + 10
−i
)
α
i
···(1 + 10
−8
)
α
8
o`u les α
i
sont des entiers ≥ 0, de taille born´ee. On aura alors ln(x) ln(10) − ln(y) avec
une erreur ≤ ln(1 + 10
−8
) ≤ 10
−8
.
Comme on connaˆıt des valeurs approch´ees de ln(10) et de ln(y) : ln(10) a et
ln(y)=α
0
ln(2) + α
1
ln(1, 1) + ···+ α
8
ln(1 + 10
−8
) α
0
a
0
+ ···+ α
8
a
8
,
on en d´eduira une valeur approch´ee de ln(x)`a2× 10
−8
si les valeurs approch´ees a
i
sont
assez pr´ecises.
2. Une r´edaction pour des ´el`eves de terminale.
On commence par expliquer l’objectif de l’algorithme comme on l’a fait comme ci-dessus.
On donne ensuite les a
i
, valeurs approch´ees `a10
−10
pr`es : ln(10) a =2, 30258509299,
ln(2) a
0
=0, 6931471806, ln(1, 1) a
1
=0, 0953101798, ln(1, 01) a
2
=0, 0099503309,
ln(1, 001) a
3
=0, 0009995003, ln(1, 0001) a
4
=0, 0000999950, ln(1 + 10
−5
) a
5
=
10
−5
, ln(1 + 10
−6
) a
6
=10
−6
, ln(1 + 10
−7
) a
7
=10
−7
et ln(1 + 10
−8
) a
8
=10
−8
.