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 :

Precision float/double sous windows et UNIX


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Points : 62
    Points
    62
    Par défaut Precision float/double sous windows et UNIX
    Bonsoir,

    j'aurais aimé avoir plus de renseignement sur la precision des float et des doubles. J'ai recherché a droite et a gauche des informations et je suis tombé sur deux defines: FLT_DIG et DBL_DIG qui valent respectivement 6 et 15.
    Dans un main de test, j'ai créé un double avec comme valeur: 2147483647.01234567890123456789.

    Lorsque je fais un std::cout de ma variable j'obtiens: 2.14748e+09
    Cependant je cherche a afficher les nombres apres la virgule. Je fais donc appelle a fixed et a setprecision mais la j'obtiens: 2147483647.012345790863037.
    Au bout du 6eme chiffres apres la virgule, j'ai donc des chiffres en random...

    Est ce que quelqu'un pourrait me donner plus d'information? Est ce que la valeur de FLT_DIG et de DBL_DIG sont le nombre de chiffre significatif (avant ET apres la virgule) ou bel et bien le nombre de chiffre apres la virgule et dans ce cas pourquoi mon double contient se nombre bizarre?

    Merci d'avance

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Ces nombres en virgule flottante sont normés, suivant le format IEEE 754. Ton problème principal vient du fait que, contrairement à une légende urbaine, il n'est PAS possible de représenter n'importe quel nombre dans ces formats.

    Quelques liens / pages de conversion pour t'aider à y voir plus clair :
    http://babbage.cs.qc.edu/IEEE-754/Decimal.html
    http://www.h-schmidt.net/FloatApplet/IEEE754.html
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Remarque annexe : en C++, les informations sont à chercher du côté de std::numeric_limits dans <limits> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::numeric_limits<double>::digits10 == DBL_DIG
    std::numeric_limits<float>::digits10 == FLT_DIG
    Ce que je comprend de la norme :
    Citation Envoyé par Norme C++
    static const int digits10;
    Number of base 10 digits that can be represented without change.
    Equivalent to FLT_DIG, DBL_DIG, LDBL_DIG.
    Citation Envoyé par Norme C
    Number of decimal digits, q, such that any floating-point number with q decimal digits can be rounded into a floating-point number with p radix b digits and back again without change to the q decimal digits :
    FLT_DIG
    DBL_DIG
    LDBL_DIG
    Donc std::numeric_limits<XXX>::digits10 (ou XXX_DIG) correspondent au nombre de chiffre d'une représentation d'un nombre en base 10 qui ne varient pas dans leur représentation en XXX.
    Donc avec std::numeric_limits<double>::digits10 == 15, les quinze chiffres suivant (en rouge) ne vont pas varier :
    2147483647.01234567890123456789.

    Ce qui correspond à ton résultat.
    Plus d'info dans cet article : Les nombres en virgule flottante de Jean-Marc Bourguet.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Points : 62
    Points
    62
    Par défaut
    si je comprends bien, la précision, qui est de 15 pour un double par exemple, c'est le nombre total de chiffre avant ET après la virgule et du coup pour set une precision pour une ecriture sur cout, on a pas besoin d'utiliser std::fixed. Il suffit juste de faire un std::setprecision
    Je pensais que c'était le nombre de chiffre après la virgule seulement :s

Discussions similaires

  1. Report sous windows et Unix
    Par yasstunisien dans le forum Reports
    Réponses: 0
    Dernier message: 01/10/2009, 14h29
  2. Reports sous Windows et UNIX
    Par karamasov59 dans le forum Reports
    Réponses: 5
    Dernier message: 23/11/2007, 10h02
  3. Exécution de JCL sous Windows ou Unix
    Par al1_24 dans le forum JCL - SORT
    Réponses: 3
    Dernier message: 23/07/2007, 20h33
  4. Code compilable sous Windows et Unix
    Par xzed dans le forum C
    Réponses: 9
    Dernier message: 16/05/2006, 16h06
  5. Norme POSIX sous Windows et Unix
    Par Franck.H dans le forum Langages de programmation
    Réponses: 9
    Dernier message: 10/10/2005, 20h46

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