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 :

std::numeric_limits et double


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut std::numeric_limits et double
    Bonjour,

    J'essaye de comprendre la librairie <limits> en C++ pour les doubles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main() {
        std::cout.precision(10000);
        std::cout << "sizeof(double) = " << sizeof(double) << std::endl;
        std::cout << "sizeof(std::numeric_limits<double>::max()) = " << sizeof(std::numeric_limits<double>::max()) << std::endl;
        std::cout << "sizeof(std::numeric_limits<double>::min()) = " << sizeof(std::numeric_limits<double>::min()) << std::endl;
     
        std::cout << "max =  " << std::numeric_limits<double>::max() << std::endl;
        std::cout << "min =  " << std::numeric_limits<double>::min() << std::endl;
    }
    Affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sizeof(double) = 8
    sizeof(std::numeric_limits<double>::max()) = 8
    sizeof(std::numeric_limits<double>::min()) = 8
    max =  179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
    min =  2.225073858507201383090232717332404064219215980462331830553327416887204434813918195854283159012511020564067339731035811005152434161553460108856012385377718821130777993532002330479610147442583636071921565046942503734208375250806650616658158948720491179968591639648500635908770118304874799780887753749949451580451605050915399856582470818645113537935804992115981085766051992433352114352390148795699609591288891602992641511063466313393663477586513029371762047325631781485664350872122828637642044846811407613911477062801689853244110024161447421618567166150540154285084716752901903161322778896729707373123334086988983175067838846926092773977972858659654941091369095406136467568702398678315290680984617210924625396728515625e-308
    Comment peut-on avoir une telle précision avec autant de chiffres sur 8 octets ?



    Autres questions : Peut-on m'expliquer clairement à quoi correspond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::numeric_limits<double>::max()
    std::numeric_limits<double>::min()
    std::numeric_limits<double>::epsilon()
    std::numeric_limits<double>::dernorm_min()
    std::numeric_limits<double>::infinity()

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    8 octets ça fait tout de même 64bits, ça laisse de la place. Et faut compter que ton affichage est peut-être modifiée par rapport à la valeur réelle.
    Pour plus d'infos sur la mémoire : http://en.wikipedia.org/wiki/Double-...g-point_format

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::numeric_limits<double>::max() // obvious je pense
    std::numeric_limits<double>::min() // voir ci-dessus
    std::numeric_limits<double>::epsilon() // la valeur minimum entre 2 valeurs différentes (si a-b < epsilon alors on considère a==b)
    std::numeric_limits<double>::dernorm_min() // la plus petite valeur > 0
    std::numeric_limits<double>::infinity() // obvious
    sur le denorm_min dont j'ignorais l'existence : http://en.wikipedia.org/wiki/Denormal_number
    j'ai toujours vu infinity défini comme 1.0/0.0 NaN comme 0.0/0.0
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut
    J'aimerais faire un test avant d'additionner deux doubles pour vérifier qu'on ne dépasse pas les valeurs max.

    Du genre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double addition(double a, double b) {
        if (fabs(std::numeric_limits<double>::max() - a) < b) {
            return a + b;    
        }
        else {
            std::cout << "Erreur dépassement" << std::endl;
            return 0.;        
        }
    }

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    à priori rien ne t'en empêche! Rencontres-tu une erreur? Si oui, laquelle?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    @Bousk: d'après ce que j'ai trouvé et qui est cohérent avec l'affichage rapporté par le PO, min() n'est pas si évident. J'aurais dit intuitivement que c'était la plus petite valeur possible, mais de toute évidence pour un double c'est la plus petite valeur STRICTEMENT POSITIVE possible (la limite d'underflow, je dirais)
    sinon concernant la détection de dépassement il faut poser les différents cas sur papier, pour s'assurer qu'ils sont couverts par le(les) tests effectués. Une recherche rapide ne m'a pas permis de trouver un algo de référence...j'y reviens plus tard

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    cf : http://en.cppreference.com/w/cpp/typ...ric_limits/min
    For floating-point types with denormalization, min returns the minimum positive normalized value. Note that this behavior may be unexpected, especially when compared to the behavior of min for integral types. To find the value that has no values less than it, use numeric_limits::lowest.
    min et denorm_min sont équivalents pour un flottant
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    nous sommes d'accord!
    pour un béotien ce n'est sans doute pas évident...

Discussions similaires

  1. delete []double et std::vector::resize()
    Par nsarras dans le forum C++
    Réponses: 4
    Dernier message: 03/05/2011, 10h03
  2. conversion std::vector<double> en std::vector<float>
    Par salseropom dans le forum C++
    Réponses: 10
    Dernier message: 10/06/2010, 10h51
  3. std::map et initialisation de double
    Par Ulmo dans le forum SL & STL
    Réponses: 15
    Dernier message: 22/12/2008, 11h37
  4. Convertir un std::string en double.
    Par vdumont dans le forum SL & STL
    Réponses: 16
    Dernier message: 10/05/2006, 16h46
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

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