Discussion:
algorithme de la fonction pow
(trop ancien pour répondre)
Olivier Miakinen
2011-09-13 09:30:01 UTC
Permalink
[Copie et suivi vers fr.comp.algorithmes]
est ce que quelqu'un saurait il quel est l'algorithme utilisé pour
implémenter la fonction pow !
Dans quelle implémentation sur quelle machine ? Sans cette précision,
je ne vois pas bien qui pourrait deviner de quel algorithme il s'agit
exactement !

À tout hasard, un algorithme est exposé ici pour le calcul de
l'exponentielle (paragraphe 6.3) et du logarithme (6.4) :
<http://hal.inria.fr/inria-00071477/PDF/>.

Sachant que a^b = exp(b.ln(a)), tu as tout ce qu'il te faut.

Je fais suivre la discussion vers fr.comp.algorithmes qui me semble
plus adapté.

Cordialement,
--
Olivier Miakinen
Etienne
2011-09-13 12:53:26 UTC
Permalink
Post by Olivier Miakinen
[Copie et suivi vers fr.comp.algorithmes]
est ce que quelqu'un saurait il quel est l'algorithme utilisé pour
implémenter la fonction pow !
Dans quelle implémentation sur quelle machine ? Sans cette précision,
je ne vois pas bien qui pourrait deviner de quel algorithme il s'agit
exactement !
Sachant que a^b = exp(b.ln(a)), tu as tout ce qu'il te faut.
Cordialement,
Ok.
bon, en fait je cherche a porter ça en assembleur.
J'ai accès aux opérations "cablées" suivantes:
- division, multiplication, addition, soustraction et racine carré.
- et j'ai trouvé les algorithmes pour le sinus et le cosinus.

Donc a^b = exp(b.ln(a)) c'est bien mais du coup ça soulève deux questions:

comment implémente t-on l'exponentiel et le logarithme.

Le but ultime étant la résolution d'une équation du 3émé degré qui
nécessites des racines cubiques.

Etienne

Ps: Olivier, j'ai rien compris au pdf que tu m'as filé ;)
Pascal J. Bourguignon
2011-09-13 13:34:15 UTC
Permalink
Post by Etienne
comment implémente t-on l'exponentiel et le logarithme.
Si tu es perdu sur une planète déserte, tu utilises les séries de
Taylor. Par exemple,

e^x = 1 + x^1/1! + x^2/2! + x^3/3! ...

Donc un algorithme simple et naïf pour calculer e^x est:

(defparameter *precision* 1e-6)

(defun taylor-exp (x)
(loop
for n from 1
for n! = 1 then (* n n!)
for x^n = x then (* x x^n)
for e = 1 then new-e
for new-e = (+ e (/ x^n n!))
until (< (abs (- e new-e)) *precision*)
finally (return new-e)))

(list (taylor-exp 3.0) (exp 3.0))
--> (20.085539 20.085537)


Sinon tu utilises Google (par exemple: exponential numerical algorithm),
ce qui te donnera en général un meilleur algorithme, mais plus compliqué
à implémenter.
--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Paul Gaborit
2011-09-13 15:25:18 UTC
Permalink
À (at) Tue, 13 Sep 2011 15:34:15 +0200,
Post by Pascal J. Bourguignon
Post by Etienne
comment implémente t-on l'exponentiel et le logarithme.
Si tu es perdu sur une planète déserte, tu utilises les séries de
Taylor. Par exemple,
e^x = 1 + x^1/1! + x^2/2! + x^3/3! ...
(defparameter *precision* 1e-6)
(defun taylor-exp (x)
(loop
for n from 1
for n! = 1 then (* n n!)
for x^n = x then (* x x^n)
for e = 1 then new-e
for new-e = (+ e (/ x^n n!))
until (< (abs (- e new-e)) *precision*)
finally (return new-e)))
(list (taylor-exp 3.0) (exp 3.0))
--> (20.085539 20.085537)
Sinon tu utilises Google (par exemple: exponential numerical algorithm),
ce qui te donnera en général un meilleur algorithme, mais plus compliqué
à implémenter.
Pour résoudre une équation du troisième degré (ou le cas particulier
d'une racine cubique), une bonne vieille méthode de Newton-Raphson me
semble tout à fait adaptée (plus rapide et plus précise).
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Etienne
2011-09-14 07:14:33 UTC
Permalink
Post by Paul Gaborit
Post by Pascal J. Bourguignon
Si tu es perdu sur une planète déserte, tu utilises les séries de
Taylor. Par exemple,
e^x = 1 + x^1/1! + x^2/2! + x^3/3! ...
Pour résoudre une équation du troisième degré (ou le cas particulier
d'une racine cubique), une bonne vieille méthode de Newton-Raphson me
semble tout à fait adaptée (plus rapide et plus précise).
Merci pour votre aide. J'ai fini par trouver une lib qui a implémenté
toutes les fonction voulues en assembleur pour le processeur concerné.

http://code.google.com/p/math-neon/source/browse/#svn%2Ftrunk

bon faudrait que j'arrive a comprendre et voir si c'est assez précis
pour ce dont j'ai besoin.

Etienne.

Pascal J. Bourguignon
2011-09-13 13:35:04 UTC
Permalink
Post by Etienne
comment implémente t-on l'exponentiel et le logarithme.
Il y a aussi une troisième solution, qui consiste à récupérer les
bibliothèques numériques fournies par le fabriquant du processeur en
question...
--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Loading...