Algorithme corrigé :
Code:
1
2
3
4
5
6
7
8 for (i=0; i<12; i++) { n=i+0.5 ; erf=erf+exp(-n*n/9.0)*sin(2.0*n*x/3.0)/n; } erf=erf*2/PI ;
Version imprimable
Algorithme corrigé :
Code:
1
2
3
4
5
6
7
8 for (i=0; i<12; i++) { n=i+0.5 ; erf=erf+exp(-n*n/9.0)*sin(2.0*n*x/3.0)/n; } erf=erf*2/PI ;
Là, apparemment : S+exp(-n*n/9.0)*sin(2.0*n*x/3.0)/n
D'après la formule, il faut mettre (i+1)/2 et non pas n=i+1/2. De plus, tu fais une boucle sur un double plutôt que sur un entier (!!), ce qui n'est pas spécialement une excellente idée à la base.
D'ailleurs, tu aurais plus de facilités à relire ton code en appliquant les points suivants :
- Utiliser les mêmes noms que dans la formule d'origine (boucle sur "n" et non pas "i", donc).
- Faire une fonction de ton calcul plutôt que de l'intégrer "en dur" dans ton programme.
- Ecrire la formule "exacte" au début, même si c'est lourd / peu optimisé, et optimiser le calcul APRÈS avoir vérifié que ça marche correctement.
Erreur dans le code :
Mac LAK :Code:
1
2
3
4
5
6 for (i=0; i<13; i++) { n=i+0.5 ; S=S+exp(-n*n/9.0)*sin(2.0*n*x/3.0)/n; } S=S*2/PI ;
Non, c'est bien i+1/2Citation:
D'après la formule, il faut mettre (i+1)/2 et non pas n=i+1/2
en faite j'ai utilise directement la deuxième partie du pdf, ou l'auteur propose cette formule dans le programme en fortran.
EDIT : J'avais pas vu le deuxième commentaire. Et bien oui c'est ça, l'erreur vient de la :ccool:
Tellement préoccupé par la boucle que je n'ai pas pensé que la partie "2/PI" était HORS de la boucle
Merci bien
EDIT 2 : comment faire pour afficher plus de chiffre avec printf ? La précision est théoriquement de 10-8 avec la méthode mais je n'affiche que 6 chiffres alors je ne peux pas le vérifier
Le double dans la boucle est il vraiment choquant ? je me demande si je fais autrement ou si je laisse car cela fonctionne ?
Toujours preneur si il y a une optimisation qui saute au yeux pour une autre partie du programme.