democrite41
Messages postés1Date d'inscriptionmardi 5 février 2013StatutMembreDernière intervention29 août 2013
-
29 août 2013 à 10:56
democrite41
Messages postés1Date d'inscriptionmardi 5 février 2013StatutMembreDernière intervention29 août 2013
-
29 août 2013 à 10:56
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
KX
Messages postés16739Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention19 mai 2024127 29 août 2013 à 10:56
Si tu veux une valeur précise de π n'utilises pas des types "double" qui ont une précision de toute façon limitée. Tu devrais plutôt regarder du côté des BigDecimal.
Ensuite au niveau du coeur du calcul il y a des optimisations à faire, par exemple un calcul Math.pow(-1,i) c'est moche ! Un test sur la parité de i serait bien plus efficace, et au lieu de calculer 2*i+1 à chaque fois tu peux le déduire d'une valeur sur l'autre en t'évitant ainsi une multiplication.
for (int i=0, n=1; i<NFOIS ;i++, n+=2)
{
pix = 1.0 / n;
if (i % 2 == 0)
pics += pix;
else
pics -= pix;
}
Rien que ça, permet de diviser le temps de calcul par 8 tout en conservant le même algorithme (alors que ce n'est déjà pas le meilleur à la base...). Et on peut faire encore un petit peu mieux, en regroupant les deux calculs (pair et impair) en un seul, pour économiser le if et enlever l'incrémentation de i et calculer le test de fin directement sur le n (qui vaut 2*i+1)
Remarque : concernant le chronomètre, si c'est prendre les nanosecondes pour les convertir en millisecondes autant prendre directement les millisecondes avec getTimeMillis...
29 août 2013 à 10:56
Ensuite au niveau du coeur du calcul il y a des optimisations à faire, par exemple un calcul Math.pow(-1,i) c'est moche ! Un test sur la parité de i serait bien plus efficace, et au lieu de calculer 2*i+1 à chaque fois tu peux le déduire d'une valeur sur l'autre en t'évitant ainsi une multiplication.
Rien que ça, permet de diviser le temps de calcul par 8 tout en conservant le même algorithme (alors que ce n'est déjà pas le meilleur à la base...). Et on peut faire encore un petit peu mieux, en regroupant les deux calculs (pair et impair) en un seul, pour économiser le if et enlever l'incrémentation de i et calculer le test de fin directement sur le n (qui vaut 2*i+1)
Remarque : concernant le chronomètre, si c'est prendre les nanosecondes pour les convertir en millisecondes autant prendre directement les millisecondes avec getTimeMillis...