cs_LordBob
Messages postés2865Date d'inscriptionsamedi 2 novembre 2002StatutMembreDernière intervention11 mai 2009
-
2 juin 2004 à 16:55
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 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.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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és225Date d'inscriptionmardi 4 mars 2003StatutMembreDernière intervention30 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és225Date d'inscriptionmardi 4 mars 2003StatutMembreDernière intervention30 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és225Date d'inscriptionmardi 4 mars 2003StatutMembreDernière intervention30 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és78Date d'inscriptiondimanche 22 février 2004StatutMembreDernière intervention24 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 5 juin 2004 à 12:47
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és1267Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention28 février 20074 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és225Date d'inscriptionmardi 4 mars 2003StatutMembreDernière intervention30 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és2865Date d'inscriptionsamedi 2 novembre 2002StatutMembreDernière intervention11 mai 20099 2 juin 2004 à 16:55
a part des mathematique, il n'y a pas grand chose a apprendre dans cette source !!!
29 juil. 2004 à 19:16
16 juin 2004 à 15:21
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.
@+
16 juin 2004 à 13:54
16 juin 2004 à 13:46
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.
@+
16 juin 2004 à 07:52
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...
16 juin 2004 à 03:00
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 !
@+
15 juin 2004 à 22:47
15 juin 2004 à 22:21
5 juin 2004 à 12:47
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)
5 juin 2004 à 12:43
3 juin 2004 à 17:32
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 ;-)
3 juin 2004 à 12:39
2 juin 2004 à 16:55