IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

question de syntaxe


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut question de syntaxe
    bonjour, je ne comprends pas le bout de code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (i=2;i<=(n>>2);i++){
     
    ..................
    }
    je ne comprends pas ce que vient faire le (n>>2). Est-ce équivalent à :
    for (i=2;i<n;i++){
    ...
    }[/CODE]
    merci

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    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
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    ... 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.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par Laurent Gomila
    ... 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...

    Le pire de l'histoire, c'est que pour notre malheur, ce genre de code apparait régulièrement
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Si tu fais du développement en grosse équipe et que tu fais, tu te fais jetter Si il y a plusieurs solutions, il vaut mieux prendre la plus simple (quitte à changer si ça pose des problèmes de performance)

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par millie
    Si tu fais du développement en grosse équipe et que tu fais, tu te fais jetter Si il y a plusieurs solutions, il vaut mieux prendre la plus simple (quitte à changer si ça pose des problèmes de performance)
    Je n'aurais pas dit "la plus simple", mais "la plus claire".

    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.

  7. #7
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    en gros si j'ai;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    istep=1
    while (n<mmax) {
     istep=mmax<<1
    ..... 
    }
    il vaut mieux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    istep=1
    while (n<mmax){
    istep=mmax*2
    }
    ????????,

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par deubelte
    en gros si j'ai;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    istep=1
    while (n<mmax) {
     istep=mmax<<1
    ..... 
    }
    il vaut mieux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    istep=1
    while (n<mmax){
    istep=mmax*2
    }
    ????????,
    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.

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    istep=mmax*2;
     
    n = valeur_de_depart; // ne pas oublier d'initialiser n
     
    while (n<mmax){
    ...
    }

  9. #9
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Voici le vrai code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
       }
    }
    Commetu le vois, mmax est modifié.
    Dans la boucle while, n est fixe. mmax varie, et on le multiplie par 2 a chaque boucle.
    Donc on pourrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     while(n>mmax){
           istep=istep*1;
    .... 
    mmax=istep;
       }

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par deubelte
    Voici le vrai code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
       }
    }
    Commetu le vois, mmax est modifié.
    Dans la boucle while, n est fixe. mmax varie, et on le multiplie par 2 a chaque boucle.
    Donc on pourrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     while(n>mmax){
           istep=istep*1;
    .... 
    mmax=istep;
       }
    Oui, MAINTENANT, je vois.

    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
    Attention aux fautes de frappe.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Debutant - Question de syntaxe "::" seuls devant u
    Par Caille dans le forum Débuter
    Réponses: 3
    Dernier message: 08/02/2006, 15h59
  2. Question de syntaxe
    Par dafalri dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 13/12/2005, 20h57
  3. [XML] Questions de syntaxe
    Par ghohm dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 03/11/2005, 12h08
  4. question sur syntaxe d'une requete
    Par sparis dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 29/09/2005, 11h58
  5. [C linux makefile] question de syntaxe
    Par Ultros dans le forum Systèmes de compilation
    Réponses: 7
    Dernier message: 09/04/2004, 07h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo