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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    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
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    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 confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    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
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    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 confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    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.

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

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    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