Calculateur de Pi

democrite41 Messages postés 1 Date d'inscription mardi 5 février 2013 Statut Membre Dernière intervention 29 août 2013 - 29 août 2013 à 10:56
democrite41 Messages postés 1 Date d'inscription mardi 5 février 2013 Statut Membre Dernière intervention 29 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.

https://codes-sources.commentcamarche.net/source/view/100087/1307814

KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 127
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)

for (int n=1, max=2*NFOIS+1; n<max;)
{
	pics += 1.0 / n;
	n+=2;

	pics -= 1.0 / n;
	n+=2;	
}


Remarque : concernant le chronomètre, si c'est prendre les nanosecondes pour les convertir en millisecondes autant prendre directement les millisecondes avec getTimeMillis...
Rejoignez-nous