bonjour, je ne comprends pas le bout de code suivant:
je ne comprends pas ce que vient faire le (n>>2). Est-ce équivalent à :Code:
1
2
3
4
5 for (i=2;i<=(n>>2);i++){ .................. }
for (i=2;i<n;i++){
...
}[/CODE]
merci
Version imprimable
bonjour, je ne comprends pas le bout de code suivant:
je ne comprends pas ce que vient faire le (n>>2). Est-ce équivalent à :Code:
1
2
3
4
5 for (i=2;i<=(n>>2);i++){ .................. }
for (i=2;i<n;i++){
...
}[/CODE]
merci
Salut,
Non, ce n'est pas équivalent...
Dans le cadre qui nous occupe, l'operateur >> provoque le décalage de deux bits vers la droite des bits qui composent la valeur de n.
Cela revient, en gros, à diviser n par 4 ;)
... ou comment rendre du code illisible en pensant faire une optimisation. Si le mec qui a écrit ça voulait optimiser, il aurait mieux fait de sortir le calcul de la boucle.
Tout à fait...Citation:
Envoyé par Laurent Gomila
Le pire de l'histoire, c'est que pour notre malheur, ce genre de code apparait régulièrement:vomi:
Si tu fais du développement en grosse équipe et que tu fais, tu te fais jetter :D Si il y a plusieurs solutions, il vaut mieux prendre la plus simple (quitte à changer si ça pose des problèmes de performance)
Bonjour,
Je n'aurais pas dit "la plus simple", mais "la plus claire".Citation:
Envoyé par millie
Et côté performance, le code proposé avec son décalage pour chaque tour de la boucle... j'ose espérer que ce n'était pas le but.
en gros si j'ai;
il vaut mieux faire:Code:
1
2
3
4
5
6 istep=1 while (n<mmax) { istep=mmax<<1 ..... }
????????,Code:
1
2
3
4
5 istep=1 while (n<mmax){ istep=mmax*2 }
Bonjour,
Le problème n'est pas d'utiliser un décalage ou une multiplication, d'autant plus que la plupart des compilateurs optimiseront d'eux-même.Citation:
Envoyé par deubelte
Le problème est de faire un calcul qui donne un résultat constant dans une boucle, ce qui est clairement inutile, à quoi tu ajoutes une initialisation de istep inutile également, puisque tu le recalcules avant utilisation.
Bien entendu, ces remarques ne tiennent que si ton mmax n'est pas modifié dans la boucle.
Si c'est bien le cas, alors il vaut mieux faire
Code:
1
2
3
4
5
6
7
8 istep=mmax*2; n = valeur_de_depart; // ne pas oublier d'initialiser n while (n<mmax){ ... }
Voici le vrai code:
Commetu le vois, mmax est modifié.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 while(n>mmax){ istep=mmax<<1; theta=isign*(6.283185/mmax); wtemp=sin(0.5*theta); wpr=-2*wtemp*wtemp; wpi=sin(theta); wr=1; wi=0; for(m=1;m<mmax;m+=2){ for(i=m;i<=n;i+=istep){ j=i+mmax; tempr=wr*data[j]-wi*data[j+1]; tempi=wr*data[j+1]+wi*data[j]; data[j]=data[i]-tempr; data[j+1]=data[i+1]-tempi; data[i]+=tempr; data[i+1]+=tempi; } wr=(wtemp=wr)*wpr-wi*wpi+wr; wi=wi*wpr+wtemp*wpi+wi; } mmax=istep; } }
Dans la boucle while, n est fixe. mmax varie, et on le multiplie par 2 a chaque boucle.
Donc on pourrait faire:
Code:
1
2
3
4
5
6 while(n>mmax){ istep=istep*1; .... mmax=istep; }
Bonjour,
Oui, MAINTENANT, je vois.Citation:
Envoyé par deubelte
Nous ne sommes pas devins, et il faut mettre tout le code nécessaire pour comprendre ce qu'il faut faire.
D'autre part, istep=istep*1; ne fait pas grand chose :mouarf:
Attention aux fautes de frappe.