CALCUL DE PI

cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008 - 25 août 2004 à 02:29
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 25 août 2004 à 16:59
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/25647-calcul-de-pi

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
25 août 2004 à 16:59
pour fflush( stdin ), je l'avais deja dis, c'est pas portable et dangereux et si on a le besoin de sauter tout ce qu'il y a dans un inputstream c'est qu'a la base l'utilisation est mauvaise

une seule regle :
toujours lire ce qu'on saisi
pinderlot Messages postés 59 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 1 septembre 2004 1
25 août 2004 à 15:11
Kirua et Pasc41, exact pour la convergence, ce n'est pas la méthode la plus rapide... et PI (arf c portnawak ce jeu de mot) mes cours de math spé M' sont déjà loin derrière moi lol.
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
25 août 2004 à 14:30
je viens de l'executer sous vc++7, en entrant par exemple 0.001, et il me retourne toujours 2
si je mets une valeur comme 1, 100, il boucle indéfiniment.
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
25 août 2004 à 14:21
fflush(stdin); est une erreur, on ne doit jamais modifier un flux d'entrée, seulement un flux de sortie => fflush(stdout);
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
25 août 2004 à 11:34
hmm, tant pis pour l'optimisation. mais au passage j'aurai pê appris qq ch à pinderlot (peut être ^^). laissez moi au moins ça pour survivre! ;)
cs_Pasc41 Messages postés 1 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 25 août 2004
25 août 2004 à 11:13
"Modulo" ou "et logique" c'est clair que la faiblesse de l'algo ne se situe pas ici, je suis d'accord que c'est le travail du compilateur...
Bref, le développement en série de l'arctangente (arctan(1)=Pi/4, utilisé ici) est extrement lent pour converger vers Pi, faîtes le test pour avoir une 20aine de décimales ça prend trop de temps...
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
25 août 2004 à 08:40
non Kirua, i&1 n'est pas plus rapide que i%2 (fait le test)
il faut jamais se croire plus fort que le compilo, il ne fait aucun doute que le modulo sera "inliner"
le code asm généré est identique
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
25 août 2004 à 02:29
pour tester si un nombre est pair, utiliser l'opérateur modulo est bouffe-ressource, surtout si tu dois le faire svt. regarde:

un nombre est sauvegardé en mémoire en base 2 (en binaire), il est donc formé de bits. ainsi, le chiffre 17 est écrit comme ceci en binaire:

10001

le bits de poids fort (celui qui ajoute le plus de valeur) est à gauche, comme avec le système décimal (5009 est bcp parce que le nobmre de poids fort vaut 5, ce qui vaut 5000 pour la valeur totale; le 9 n'ajoute que 9 à la valeur totale, parce que c'est le nombre de poids faible).

en réalité, avec les bases on fait comme ça (exemple pour la base 2) (note: ^ veut dire exposant)

2^4 2^3 2^2 2^1 2^0
1 0 0 0 1

(note: x^0 = 1, quel que soit x)

donc le chiffre ici vaut 2^0 + 2^4 1 + 16 17.

tu peux facilement comprendre que tous les nombres pairs auront le bits de poids faible (à droite) à 0, et les nombres impairs l'auront à 1, puisque la valeur totale est une somme de puissances de 2, et que 2^0 est le seul nombre impair!

ce qu'il faudrait dc, pr tester la parité d'un nombre, c'est pouvoir lire son dernier bit (son bit de poids faible), comme ça on saurait à très faible coup s'il est pair ou pas (car les opérations sur les bits ne coutent quasi rien).

chance: ça existe! tu dois utiliser l'opérateur &. voici une sorte de table de vérité de cet opérateur:

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

tu le vois, si on applique l'opérateur & sur deux bits, ça ne renvoie true (1) que si les deux bits comparés sont activés. donc si tu as ton 17 (10001) et que tu le 'AND' (&) avec 00001, tu auras ceci:

10001
00001
---------&
00001

puisque dans ton nombre 00001 il n'y a que le dernier bit qui est allumé, la condition ne peut être vraie au global QUE si le dernier bit du nombre original (17) l'est aussi! si par contre tu avais 6:

110 ( 4+2 6)

et que tu le AND avec 001, ça te donne:

110
001
------&
000

et donc une valeur globale de 0, ce qui signifie que le dernier bit n'est pas allumé, et que donc le nombre 6 est pair!


pour résumer, tu devrais remplacer ceci:

if(n%2) //si n est impair

par ceci:

if(n&1)

qui coûte bcp moins cher en terme de ressources.

bonne journée,

Kirua
Rejoignez-nous