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 tr�s 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
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 tr�s 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
    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 Expert
    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
    Par d�faut
    � priori rien ne t'en emp�che! Rencontres-tu une erreur? Si oui, laquelle?

  5. #5
    Membre Expert
    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
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 Expert
    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
    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