CALCUL DE RACINE "MACHINE PUR"

cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 - 2 juin 2004 à 16:55
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 29 juil. 2004 à 19:16
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/23338-calcul-de-racine-machine-pur

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
29 juil. 2004 à 19:16
super, je vais voir si je peux réutiliser le principe de ton code pour les racines cubiques ect..
Bombela Messages postés 225 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 30 juillet 2008
16 juin 2004 à 15:21
lol

Je crois que pour avoir le maximum de précision, il faut écrire des opération sur des chaînes de nombres décimaux.
Comme ça, ça fonctionne comme ce qu'on fais sur le papier, et il set possible de faire des chaîne de 2go, c'est à dire 2go de chiffres à la suite.

Après, on peux optimiser et avoir quelque chose de rapide.

@+
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
16 juin 2004 à 13:54
je lisais le document qui parlait de l'ASM pour expliquer les capacités du processeur et du l'unité des nombres à virgule flottante, mais moi je fais tout en C++, j'ai jamais fait d'ASM ;-)
Bombela Messages postés 225 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 30 juillet 2008
16 juin 2004 à 13:46
Si tu le dis !

Dans ce cas, je suis d'accord avec toi !
Perso, j'ai pas encore utilisé le FPU ni même les nombre négatif en ASM alors J'suis pas en avance :0)

Mais l'avantage du FPU, c'est la simplicitée d'utilisation.
Après, le calcul d'une racine n'est pas compliqué, et c'est très rapide sur un pc moderne.

@+
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
16 juin 2004 à 07:52
ouais ben le FPU... on est fachés tous les deux, je dois dire qu'on s'aime pas bcp mutuellement.
Dans la doc Intel sur leurs processeurs, ils arrêtent pas de vanter la précision de leurs opérations arithmétique etc etc grâce à leur magnifique FPU. N'empêche que c'est d'une imprécision crasse! Je suis bien conscient du fait, évidemment, on ne peut pas être précis sûr un ensemble continu et infini, mais à défaut, moi j'aurais préféré que les float et les double soient précis à x décimales et que ce soit garanti! quitte à ce que ça prenne plus de place en mémoire...
Bombela Messages postés 225 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 30 juillet 2008
16 juin 2004 à 03:00
Comic Kirua ;)

Vous savez que le FPU du CPU supporte les racines et même les racines d'équation du deuxième degrée ?

En asm, ç'est donc facile à faire (j'ai pas testé) et ultra rapide !

@+
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
15 juin 2004 à 22:47
c'est juste une manière maladroite de dire qu'il a codé la routine lui-même plutôt que d'utiliser la méthode super optimisée fournie dans la bib standard ;)
cs_wolfcyber Messages postés 78 Date d'inscription dimanche 22 février 2004 Statut Membre Dernière intervention 24 juillet 2005
15 juin 2004 à 22:21
c koi ton histoire de machine pur ?? je vois du C, des maths, mais autement.......
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
5 juin 2004 à 12:47
http://www.cplusplus.com/ref/cmath/index.html

au temps pour moi, tu n'as qu'à utiliser fabs() (abs() est pour les entiers seulement).

(depuis tjs je recode cette fonction en static dans mes classes... c'est malin! lol)
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
5 juin 2004 à 12:43
juste un détail Kirua la fonction abs() existe en standard dans math.h donc soit tu utilises celle-là soit tu donnes un autre nom à la tienne.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
3 juin 2004 à 17:32
ai=x/2;
aj=(ai+(x/ai))/2;

x/ai x / (x/2) x * 2/x = 2, donc autant utiliser cette valeur là directement non? ça fait un calcule de moins.

ça fait aj = x/4 + 1;

ensuite, la condition de ta boucle (celle qu'il est important d'optimiser)

while ((aj-ai)/ai<-e || (aj-ai)/ai>e )

tu fais deux divisions pour le même calcul, alors soit tu sauves la valeur dans une variable du genre float tmp = (aj-ai)/ai; tu la mets à jour en fin de boucle (et avant la boucle) et tu remplace par tmp dans ta condition, soit, mieux, tu utilises la valeur absolue:

//en début de fichier: c'est une fonction inline comme tu peux voir
//qui renvoie la valeur absolue d'un nombre flottant
inline float abs(float a){return a < 0 ? -a : a; }

et donc:

while(abs((aj-ai)/ai) > e )
{
...
}

et comme ça tu n'as qu'une seule division (au lieu de deux) et tu n'as pas de variable tampon, donc ton code n'est pas moins "propre".

vala pr mon avis ;-)
Bombela Messages postés 225 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 30 juillet 2008
3 juin 2004 à 12:39
Ouaip, t'as raison LordBob, mais les débutant ne savent forcément comment on trouve une racine et comment ça s'implémente.
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
2 juin 2004 à 16:55
a part des mathematique, il n'y a pas grand chose a apprendre dans cette source !!!
Rejoignez-nous