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 :

numeric_limits epsilon explication


Sujet :

C++

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut numeric_limits epsilon explication
    Salut,

    je ne comprends pas cette fonction, qui est définie par Machine epsilon (the difference between 1 and the least value greater than 1 that is representable)

    Preneur d'une explication

    Merci

  2. #2
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    pourquoi la différence entre 1 et la prochaine valeur , et pas 10 et la prochaine valeur par exemple ?

  4. #4
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    c'est le standard, et en general on essaye de le garder simple.
    En outre, pour des valeurs > 1 , l'exposant decale la mantisse et tu perdrais des bits d'informations.

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    Je te suis pas sur ta deuxième phrase dsl, si tu pouvais préciser ?
    Quand tu dis que l'exposant décale la mantisse, je pensais que l'exposant et la mantisse était tous les deux coder sur un nombre de bits fixe.

  6. #6
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    plus l'exposant est gros plus le dernier bit de la mantisse est une grosse valeur.

    on compare toutjours k avec k + k*epsilon. On parle alors d'Unit in the Last Place, qui est la mesure de l'erreur tenant compte des magnitudes relatives des valeurs.

    1 ulp = |k - k+k*epsilon|/epsilon

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    Dans le lien il est indiqué que l'epsilon pour un double est pow (2, - 53)
    avec ce programme pourtant quand j'utilise comme val pow(2,-53) et std::numeric_limits<double>::epsilon(), le dernier bit de l'exposant n'est pas le même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #include <iostream>
    #include <vector>
    #include <limits>
    #include <math.h>
    #include <iterator>
    #include <boost/lexical_cast.hpp>
    using namespace std;
     
    template<class T> vector<string> toBinary(const T num) 
    {
    	vector<string> mybits( sizeof(T)*CHAR_BIT );
     
    	const char * const p = reinterpret_cast<const char*>(&num);
     
    	for (int i = sizeof(T)-1; i >= 0; i--)	
            for (int j = CHAR_BIT-1; j >= 0; j--)		
    		{
    			bool b = (p[i] & (1 << j));
                mybits[i*CHAR_BIT + j] = boost::lexical_cast<std::string>( b );		
    		}
     
    	mybits.insert(mybits.end()-1,".");
    	mybits.insert(mybits.end()-13,".");
    	return mybits;
    }
     
    template<class T> void printInfo(T val)
    {
    	auto v = toBinary(val);	
    	copy(v.rbegin(),v.rend(),ostream_iterator<string>(cout,""));
    	cout << "\n";
    }
     
    int main() 
    {
    	printInfo<double>(  std::numeric_limits<double>::epsilon() );
    	//0.01111001011.0000000000000000000000000000000000000000000000000000
     
    	double v = 2.;
    	int	   e = -53;
    	printInfo<double>( pow(v,e) );
    	//0.01111001010.0000000000000000000000000000000000000000000000000000
     
    	cin.get();
    }
    EDIT: ok car en faite std::numeric_limits<double>::epsilon() correspond à pow(2,-52) et non pow(2,-53) comme indiqué dans le lien wikipedia

Discussions similaires

  1. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34
  2. pointeurs (explications)
    Par isidore dans le forum C
    Réponses: 4
    Dernier message: 18/04/2003, 10h41
  3. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  4. Recherche code d'un fifo,ou explication
    Par don-diego dans le forum C
    Réponses: 8
    Dernier message: 25/07/2002, 10h26
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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