Partage
  • Partager sur Facebook
  • Partager sur Twitter

une calculatrie qui ne marche pas

Sujet résolu
    18 juin 2018 à 9:46:49

    Bonjour

    j'essayais de faire le calcule suivant en C++ :

    cout << fixed <<(813635465428626 % (__int64)pow(10, 18 - 3)) * pow(10, 3) << endl;
    et le programme me retourne:
    813635465428626048

    alors que si je l’écris sur une calculatrice cela me donne ceci :

    une différence de 42.

    quelqu’un serais m’expliquer d’où vient cette différence?

    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2018 à 9:49:17

      Salut,

      Oui, n'utilise pas pow pour des puissances entières. Pow renvoie un double, donc quelque chose d'approché.

      Fait toi ta propre fonction de puissance, qui renvoie un __int64 dans ton cas. (dedans un simple for)

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        18 juin 2018 à 10:08:18

        Bonjour,

        Les nombres long long sont limités à 9 223 372 036 854 775 807, donc ton calcul peut être entièrement effectué en long long. sauf que le dernier pow() force une conversion en double. Et les double permettent d'avoir des nombres plus grands mais avec moins de précision (~16 chiffres significatifs).

        Ton calcul est donc près des limites des types standards du langage.
        Ta calculatrice doit vraisemblablement utiliser des types plus précis, le C++ ne peut pas concurrencer avec cela à moins d'utiliser un bibliothèque pour du calcul de précision ou d'implémenter toi même un type plus précis.

        • Partager sur Facebook
        • Partager sur Twitter

        En recherche d'emploi.

          18 juin 2018 à 11:26:59

          merci Fvirtman cetait cela et voici la fonction pour ce qui la cherche:

          pow10.h

          //package
          //basic	
          
          
          //project
          
          
          
          
          __int64 pow10(__int8 pow); // pow10(pow); : return 10^pow

          pow10.cpp

          #include "pow10.h"
          
          //package
          //basic	
          
          
          //project
          
          
          
          
          __int64 pow10(__int8 pow)
          {
          
          	__int64 resultat = 1;
          
          	for (int i = 0; i < pow; i++)
          	{
          
          		resultat *= 10;
          
          	}
          
          	return resultat;
          
          
          }

          Dalfab a écrit:

          Bonjour,

          Les nombres long long sont limités à 9 223 372 036 854 775 807, donc ton calcul peut être entièrement effectué en long long. sauf que le dernier pow() force une conversion en double. Et les double permettent d'avoir des nombres plus grands mais avec moins de précision (~16 chiffres significatifs).

          Ton calcul est donc près des limites des types standards du langage.
          Ta calculatrice doit vraisemblablement utiliser des types plus précis, le C++ ne peut pas concurrencer avec cela à moins d'utiliser un bibliothèque pour du calcul de précision ou d'implémenter toi même un type plus précis.

          ce calcule est fait pour exploité 3 __int64 a la fois (pour stoqué du temps allant de la yotta seconde (1 ys = 10^24 s) a la  yocto seconde(1 ys = 10^-24 s) de plus je transforme directement le pow en __int64



          -
          Edité par jules de cube 18 juin 2018 à 11:34:15

          • Partager sur Facebook
          • Partager sur Twitter
            18 juin 2018 à 16:25:20

            Salut,

            jules de cube a écrit:

            ce calcule est fait pour exploité 3 __int64 a la fois (pour stoqué du temps allant de la yotta seconde (1 ys = 10^24 s) a la  yocto seconde(1 ys = 10^-24 s) de plus je transforme directement le pow en __int64

            Heu... Tu te rend compte que tu voudrais donc stocker des valeurs s'étendant sur un intervalle de 10^48 ????  Aucun type de base ne pourra te fournir un intervalle suffisant, vu que, au mieux, unsigned long long permet la représentation de valeurs comprise dans l'intervalle [0,2^64[ :p

            Sans oublier qu'une addition sur des valeurs "proches des limites" pourrait nécessiter de représenter une valeur de l'ordre de 10^48 et que, si on parle d'une multiplication, cette valeur peut aller jusqu'à 10^98 (si je ne m'abuse, du moins)

            Pour manipuler de tels ordres de grandeur, tu n'as pas d'autre choix: tu dois passer en précision arbitraire. LibGMP pourrait éventuellement faire l'affaire ;)

            Mais comme je présumes que tu ne voudras pas manipuler tes yotta en les connaissant sous la forme de yocto (seul moyen d'arriver au résultat avec des valeurs entières), une libMPFR devrait te permettre de les manipuler sous forme d'unité (seconde, dans le cas présent?) ;)

            • Partager sur Facebook
            • Partager sur Twitter
            Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
              19 juin 2018 à 0:10:45

              sachant que l'univers existe depuis approximativement au maximum 13.9 milliards d’années d’après la théorie du big bang.

              60*60*24*365.25 *(13.9^9) = 4,3865064*10^17 s.  ce qui n'est même pas 1 exaseconde (1 Es = 10^18 s)

              sachant que je combine 3 __int64(comme si dessous) qui mène a une capacité de 10^30 s.Ce qui veux dire aussi que je peux stoqu

              10^30 /4,3865064*10^17 / = 2.28*10^12 fois l'age de univers.

              donc je n’ai pas a me soucier de la taille lors des calcules et de plus comme les variable classique je vérifie si le calcule ne dépasse pas la taille de mes variables

              • Partager sur Facebook
              • Partager sur Twitter
                19 juin 2018 à 4:23:13

                Soit... Si tu arrive à me représenter tous les bits de ta donnée pour cette fameuse valeur de 4,3865064*10^17 s ...

                Ou mieux encore: si tu arrives à me la représenter en yocto seconde (en binaire, cela va de soi ;) )

                Parce que j'avouerai que j'ai du mal à interpréter l'image que tu me présente ;)

                -
                Edité par koala01 19 juin 2018 à 4:26:32

                • Partager sur Facebook
                • Partager sur Twitter
                Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait

                une calculatrie qui ne marche pas

                × 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