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 :

erreurs de calculs bizarres


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut erreurs de calculs bizarres
    Bonjour,

    je suis en train de programmer un algorithme de cryptage basique, et pour ça, j'ai besoin de changer des chaines de caractères (QString, car j'utilise Qt) en nombres via le code ASCII de chaque caractère (abab => 97098097098, par exemple). Pour ça, j'ai fait cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    long double codeASCIIsequence(0);
    QString chaine = separations[i];
    for(int j(0); j<chaine.size(); j++)
    {
        char caractere = chaine.toStdString().c_str()[j];
        int ascii = (int)(caractere);
        codeASCIIsequence*=1000;
        codeASCIIsequence+=ascii;
    }
    Le problème, c'est que quand je fais tourner cette séquence avec des chaines plutôt grandes (>8 caractères), les deux opérations (addition et multiplication) ne se font plus bien, ce qui génère des erreurs aléatoires, alors que la variable int peut stocker des nombres largement supérieurs à 1000 et la variable long double (CORRECTION) peut aller jusqu'à plus de 10^400, je crois, et que ces erreurs arrivent pour des valeurs de l'ordre de 10^20-10^25.

    Quelqu'un pourrait m'expliquer :
    1°) d'où viennent ces erreurs
    2°) comment les éviter ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par leberra Voir le message
    la variable unsigned long peut aller jusqu'à plus de 10^400, je crois, et que ces erreurs arrivent pour des valeurs de l'ordre de 10^20-10^25.
    Le maximum de 32 bits signé est 2 milliards (2⋅109)

    Pour du 64 bits, en utilisant la règle 210≈103 pour calculer sur le pouce, on tombe sur un maximum autour de 1018.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Sur un autre site, j'avais lu que ça pouvait aller jusqu'à 3.4*10^4932, les long double

    Si ce n'est pas le cas, comment résoudre mon problème ?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    effectivement, j'avais confondu unsigned long et long double dans mon premier post

    J'ai corrigé le post

    la limite des unsigned long étant effectivement de 4 294 967 295

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Le problème est que les long double comme tous les flottants ont une précision limitée.
    C'est 16 ou 20 chiffres significatifs
    Quand le nombre atteint 10^20, on ne peut plus rien lui ajouter.
    exemple : 1234567890123456789xxxxx + 123 = 1234567890123456789xxxxx
    Un long double fait 8 ou 10 octets, quoi que l'on fasse il ne pourra stocker des dizaines de caractères...

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    alors comment faire stocker à l'ordinateur des nombres plus grands, de manière précise et avec lesquels tu peux faire des calculs ? Tu dois utiliser quelle variable ?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour ça, il faut utiliser une bibliothèque de grands entiers.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    tu pourrais me donner un nom et me dire vite fait comment l'utiliser ? J'ai entendu parler (ou plutôt lu écrit) de la gmp... C'est de ce genre de bibliothèque que tu parles ? Et si oui, tu pourrais me dire où je pourrais la récupérer ?

  9. #9
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut


    Tu peux utiliser une bibliothèque comme MPIR ou GMP (un tutoriel pour la première : http://tcuvelier.developpez.com/tuto.../introduction/).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    merci du conseil. Je l'installe demain (car il est un peu tard pour ça aujourd'hui), je l'intègre dans mon code et je te dis si ça marche, mais il n'y a pas de raison pour que ça ne fonctionne pas, alors merci d'avance

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    hum... J'ai l'habitude de compiler simplement sur Qt (ou codeblocks) mais quand je cherche MinGW dans leurs dossiers respectifs, je tombe sur plusieurs fichiers exécutables qui portent un nom un peu différent (du style : i686-w64-mingw32-c++) et aucun qui génère une fenêtre qui reste plus d'1/4 de seconde. J'ai essayé de les ouvrir en console, mais aucun n'accepte les paramètres donnés sur comment installer MPIR

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    effectivement, ça va mieux avec une bibliothèque de grands nombres. Perso, j'ai pas réussi à installer MPIR (un problème de compilateur introuvable), mais j'ai pris GMP à la place. ça fonctionne nickel. Il reste plus qu'à faire l'inverse : un algo pour décoder mes messages cryptés... J'ai encore du boulot, même si, en théorie, il suffit de "faire l'inverse"

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bonjour,
    Citation Envoyé par leberra Voir le message
    2°) comment les éviter ?
    On ne fait JAMAIS de système de cryptage en utilisant un type de donnée dont les valeurs ne sont pas certaines, ce qui est le cas de tous les types pour les nombres réels.
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    nan, sans blague ?

    T'inquiète pas pour ça, je suis pas stupide à ce point, et c'était justement pour savoir comment obtenir des valeurs certaines avec de très grands nombres que j'ai créé cette discussion. Et effectivement (même si, moi même, je m'en doutais un peu), ça fonctionne mieux sans erreurs liées à des approximations

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

Discussions similaires

  1. [SQL] Erreur de parse bizarre...
    Par TommyWeb dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/02/2006, 23h54
  2. [Tableaux] erreur de calcul
    Par dleu dans le forum Langage
    Réponses: 18
    Dernier message: 08/12/2005, 13h28
  3. erreur sur calcul
    Par Sendo dans le forum Access
    Réponses: 2
    Dernier message: 29/09/2005, 09h46
  4. Rotation erreur de calcul
    Par Speed41 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 09/03/2005, 16h55
  5. C++Builder fait une erreur de calcul
    Par gandf dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/01/2004, 22h27

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