Partage
  • Partager sur Facebook
  • Partager sur Twitter

ne peut pas multiplier un nombre par lui même

    30 septembre 2020 à 10:05:09

    Bonjour, en considérant le code suivant :

    #include "iostream"

    int main() {

        int a = 0;

        unsigned long long int bignum = 2;

        while (a==0) {

            cout << bignum;

            bignum = bignum * bignum;

        }

    }

    le programme au lien de d'afficher bignum * bignum affiche 0, quelqu'un pourrait m'aider ?

    désolé d'avance pour l'écriture, je suis sur mobile

    • Partager sur Facebook
    • Partager sur Twitter
      30 septembre 2020 à 10:32:57

      Au lieu de faire une boucle sans fin, fait une boucle qui s'arrête au bout de 10 itération par exemple, tu comprendra mieux ce qui ce passe.

      Parce que ton calcul arrive très très vite à dépasser la capacité des long long int !

      PS : Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).

      • Partager sur Facebook
      • Partager sur Twitter
        30 septembre 2020 à 10:41:30

        Salut,

        Utilise https://en.cppreference.com/w/cpp/types/numeric_limits pour voir les capacités de unsigned long long

        • Partager sur Facebook
        • Partager sur Twitter
          1 octobre 2020 à 16:25:24

          message supprimé



          -
          Edité par Raynobrak 2 octobre 2020 à 10:19:22

          • Partager sur Facebook
          • Partager sur Twitter
            2 octobre 2020 à 7:19:55

            Et ça va trèes vite, en général si sizeof(long long) == 8 -> 64
            après 64 tours de boucle (63 si on part à 2), tu dépasses la limite.

            -
            Edité par PierrotLeFou 2 octobre 2020 à 7:23:36

            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              2 octobre 2020 à 10:45:40

              Salut,

              Si tu lances ton programme et que tu fais vite un CTRL+C pour l'arrêter et que tu regardes le début de la série, tu as bien :

              2, 4, 16, 256, 65536, 4'294'967'296 et le nombre suivant devrait être 1,844674407370955 * 10^19, ce qui est un peu supérieur à la limite (2^64 = 1.8446744 * 10^19). Tu dépasses la limite en seulement 7 tours de boucle...

              Donc ton code fonctionne, c'est juste que tu dépasses la limite d'un unsigned long long et que tu tombes sur 0 et que 0*0=0 donc forçément tu vas rester coincé sur cette valeur.

              Si c'est ce que tu cherches, je crois qu'il existe des bibliothèques qui permettent de dépasser cette limite en stockant les entiers d'une manière différente.

              • Partager sur Facebook
              • Partager sur Twitter

              ne peut pas multiplier un nombre par lui même

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown