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 :

Plus grand entier ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut Plus grand entier ?
    Bonsoir,

    Je dois réaliser un programme qui me permette de calculer le plus grand entier, ( ce qui revient à calculer la limite de la série de terme général 1 ).
    J'ai essayé de faire un programme, mais visiblement ça buggue, et je vois pas où.

    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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
    int s=0;
    int r=1;
     
    while(abs(r-s)==1)
    	{
    		r=s;
    		s=s+1;
     
    	}
     
    cout << " La limite est : " << r <<endl;
     
    return 0;
     
    }
    le principe si j'ai bien compris, c'est que quand j'arrive au plus grand entier que je puisse coder, je retombe au plus petit, donc je voulais calculer la somme des 1 jusqu'à que la différence de 2 entiers "successifs" soient différente de 1. ( En gros, quand je suis arrivé au plus grand entier codable, et que l'entier suivant est le plus petit codable.)

    Je ne comprends pas ce qui ne va pas ?
    J'ai surement mal compris quelque chose d'ailleurs.

    merci d'avance.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par rouliane Voir le message
    Bonsoir,

    Je dois réaliser un programme qui me permette de calculer le plus grand entier, ( ce qui revient à calculer la limite de la série de terme général 1 ).
    J'ai essayé de faire un programme, mais visiblement ça buggue, et je vois pas où.

    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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
    int s=0;
    int r=1;
     
    while(abs(r-s)==1)
    	{
    		r=s;
    		s=s+1;
     
    	}
     
    cout << " La limite est : " << r <<endl;
     
    return 0;
     
    }
    le principe si j'ai bien compris, c'est que quand j'arrive au plus grand entier que je puisse coder, je retombe au plus petit, donc je voulais calculer la somme des 1 jusqu'à que la différence de 2 entiers "successifs" soient différente de 1. ( En gros, quand je suis arrivé au plus grand entier codable, et que l'entier suivant est le plus petit codable.)

    Je ne comprends pas ce qui ne va pas ?
    J'ai surement mal compris quelque chose d'ailleurs.

    merci d'avance.
    Bonsoir, c'est condition de sortie de while qui n'as l'air pas bonne.
    fait plutôt
    while (r<s)
    car nbMax+1 == nbMin

  3. #3
    Membre averti Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Points : 358
    Points
    358
    Par défaut
    Methode plus marrante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int i = 0;
    for( ; i >=0;i++);
    i--;
    cout << " La limite est : " << i <<endl;
    Explication : une fois le plus grand atteint, tu passe au plus petit, effectivement, qui se trouve etre ... negatif.

    Donc, une fois que tu tape sur un nombre negatif, tu reviens en arriere une fois, et voila.

    Accessoirement, le max des int c'est 2 puissance 31 - 1, le max des unsigned int c'est 2^32 - 1.

    Sinon, avec ton programme, essaye avec while(r<s), pour les même raisons.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut
    ah oui, bien sur, merci mongaulois !

    Et merci à kujara pour l'autre méthode

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <limits>
    #include <iostream>
     
    int main()
    {
      std::cout << " La limite est : " << std::numeric_limits< int >::max() << std::endl;
      return 0;
    }
    Mais j'imagine que c'est un peu tricher...

    MAT.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    pire:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
     int max = static_cast<int> (~static_cast<unsigned int>(0)>>1);
    et c'est même pas triché
    sinon pour optimisé ton 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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
    int s=0;
    int r=1;
     
    while(r<s)
    	{
    	r=s;
    	s=static_cast<int> (~static_cast<unsigned int>(s)<<1 +1);
     
    	}
     
    cout << " La limite est : " << r <<endl;
     
    return 0;
     
    }

  7. #7
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Kujara Voir le message
    Accessoirement, le max des int c'est 2 puissance 31 - 1, le max des unsigned int c'est 2^32 - 1.
    Ben non... justement... ça dépend...

    Mais je vais donner un code encore plus top !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return int((~(unsigned int(0))) >> 1);
    ou... sans le ~

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return int(unsigned int(-1) >> 1);


    edit: Oups... j'avais pas vu que c'était la proposition de mongaulois (les static_cast en moins ! )
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par nicroman Voir le message
    ~

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return int(unsigned int(-1) >> 1);
    lol,
    je me suis fait chier à faire ~0 pour -1 au lieux d'utiliser -1... Et j'y avait même pas pensé
    y as des fois, je cherche compliqué...
    Sinon j'avais une petite question, pourquoi int(-1)>>1 donne -1 ? pour les décalages faut utiliser des unsigned?

  9. #9
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    En fait... comme beaucoup de chose... le décalage d'un signed int est.... "unspecified"...

    Ca dépend donc de l'implémentation du compilateur.

    Visual C++ par exemple, laisse le bit de poid fort à la valeur qu'il avait avant la rotation (conservation du signe).
    Pour les unsigned int par contre, tous les bits doivent être décalés avec padding à 0.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par nicroman Voir le message
    En fait... comme beaucoup de chose... le décalage d'un signed int est.... "unspecified"...

    Ca dépend donc de l'implémentation du compilateur.

    Visual C++ par exemple, laisse le bit de poid fort à la valeur qu'il avait avant la rotation (conservation du signe).
    Pour les unsigned int par contre, tous les bits doivent être décalés avec padding à 0.
    C'est sûr que le décalage d'un signed est "unspecified" ?

    C'est une vrai question et pas un troll.

    Sur toutes les CPU sur lesquelles j'ai travaillé, l'instruction assembleur de décalage d'un nombre signé existait.

    Raymond
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    C++ ne spécifie pas le codage utilisé pour représenter les entiers signés.
    Boost ftw

  12. #12
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Sur toutes les CPU sur lesquelles j'ai travaillé, l'instruction assembleur de décalage d'un nombre signé existait.
    Oui... mais qu'une instruction assembleur existe ne veut pas dire qu'il existe une commande équivalente exacte dans C++...
    Regarde par exemple les instructions de circular-shift, qui existent sur tous les CPUs (ou presque), n'ont pas d'équivalent C++ (à mon grand étonnement aussi, mais bon ).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  13. #13
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    De même, toutes vos méthoses "rusées" ne marchent pas dans l'absolu, car elles supposent que les entiers signés sont gérés par un code complément à deux, ce qui n'a rien d'obligatoire en C++. Et je crois même qu'il y a de vieilles architectures où ce 'nest pas le cas.

    Donc, dans l'absolu, la seule méthode correcte et en O(1) est celle de Mat007.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Déterminer la Valeur la plus grande dans une table
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 9
    Dernier message: 22/08/2014, 23h35
  2. Calcul du plus grand diviseur commun de deux entiers relatifs
    Par odsen.s dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 17h21
  3. [JFrame] Création d'une fenetre plus grande que l'ecran
    Par thetoctoc dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 23/09/2004, 11h05
  4. Obtenir le plus grand entier !
    Par Gogoye dans le forum C
    Réponses: 3
    Dernier message: 09/12/2003, 09h40
  5. Réponses: 3
    Dernier message: 16/12/2002, 16h12

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