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 :

calcul "grand" nombre fiable en c++?


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 16
    Points : 23
    Points
    23
    Par défaut calcul "grand" nombre fiable en c++?
    Bonjour,

    Je suis actuellement en stage et dans mon programme j'ai créer une map avec des clefs flottantes (mauvaise idée). Suite à des problèmes de précisions de flottant pour accéder à ma map j'ai écris ma propre fonction de comparaison. Je suis tomber sur un papier qui traîte du problème de la précision des float. Dans cet article ils donnent un exemple de code qui suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    float x =  10e30;
    float y = -10e30;
    float z =  1.0;
     
    cout << (x + y) + z  << endl; // retourne 1
    cout <<  x +(y  + z) << endl; // retourne 0
    Le code devrait retourner 1 dans tous les cas. Mais que ce soit en double ou en float et pour des puissances supérieures ou égales à 19 (je n'ai pas beaucoup testé non plus) le calcul à la ligne 6 retourne 1 et 0 à la ligne 7.



    Ma question est donc: existe -t-il une limite en dessous de laquelle je peux manipuler des nombres sans avoir à me soucier des problèmes de "codage de float"?


    edit: l'article dont je parle est ici

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    oui, s'ils tiennent dans un entier de la taille de la mantisse du type flottant manipulé.
    a priori, c'est int13 pour le float.
    Prolème, cela signifie d'être dans [-8192, 8191] ce qui n'est pas "grand".

    Il existe une solution: la manipulation de nombres comme chaines de chiffres, souvent nommée big integer (mais qui doit exister pour les réels)

    Il existe aussi la solution dite en "virgule fixe" (je ne l'ai pas étudiée, c'est peut-être un autre nom de la précédente)

    Les floats sont manipulables ensemble s'ils sont du même ordre de grandeur (ou presque)

    Essaie autant que possible de rester dans les entiers.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 16
    Points : 23
    Points
    23
    Par défaut
    Merci beaucoup pour la réponse et les pistes.

    Citation Envoyé par leternel Voir le message
    oui, s'ils tiennent dans un entier de la taille de la mantisse du type flottant manipulé.
    a priori, c'est int13 pour le float.
    Prolème, cela signifie d'être dans [-8192, 8191] ce qui n'est pas "grand".
    Sinon pour la taille de la mantisse selon la norme IEEE 754 (http://fr.wikipedia.org/wiki/IEEE_754) elle est de 23, ducoup l'intervalle est [8388608 ; 8388607].

    j'ai vérifié que la norme IEEE 754 est utilisé par le compilateur avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #inlude <limits>
     
    using namespace std;
     
    [...]
     
        if ( numeric_limits<float>::is_iec559 )
            cout << "--OK--" << endl;

    pour la fonction is_iec559 :
    http://en.cppreference.com/w/cpp/typ...mits/is_iec559


    En tout cas je vai essayer de faire le plus possible avec des entier

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

Discussions similaires

  1. Calcul de grands nombres
    Par Eric17m dans le forum Débuter
    Réponses: 8
    Dernier message: 12/02/2015, 14h05

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