cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008
-
25 août 2004 à 02:29
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 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.
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 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és59Date d'inscriptionjeudi 1 juillet 2004StatutMembreDernière intervention 1 septembre 20041 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és338Date d'inscriptionjeudi 22 août 2002StatutMembreDernière intervention14 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és338Date d'inscriptionjeudi 22 août 2002StatutMembreDernière intervention14 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és1Date d'inscriptionmardi 6 avril 2004StatutMembreDernière intervention25 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és3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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!
25 août 2004 à 16:59
une seule regle :
toujours lire ce qu'on saisi
25 août 2004 à 15:11
25 août 2004 à 14:30
si je mets une valeur comme 1, 100, il boucle indéfiniment.
25 août 2004 à 14:21
25 août 2004 à 11:34
25 août 2004 à 11:13
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...
25 août 2004 à 08:40
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
25 août 2004 à 02:29
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