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 :

Comment trouver Epsilon(par calcul) [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Par défaut Comment trouver Epsilon(par calcul)
    Salut tout le monde,je suis debutant en C. Bon,j'ai essayé de cherche l'epsilon par calcul,mais ca m'affiche toujours 0.000000 comme resultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include<stdio.h>
    main()
    {
          float x=1;
          while ( x/2 != 0 )
                            {
                                 x=x/2;
                            }
          printf("%f", x);
          getchar();
    }
    Aidez moi et merci infiniment.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par DeViLGoRe
    Salut tout le monde,je suis debutant en C. Bon,j'ai essayé de cherche l'epsilon par calcul,mais ca m'affiche toujours 0.000000 comme resultat.
    Je ne suis pas spécialiste des maths, mais je ne suis pas sûr qu'on puisse calculer EPSILON. C'est sans doute pour ça qu'il est défini dans <float.h> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FLT_EPSILON
    DBL_EPSILON
    LDBL_EPSILON
    D'autre part, on ne peut pas utiliser == ou != avec des flottants, parce que la représentation interne est une approximation. On utilise précisément une différence absolue (fabs()) que l'on compare à xxx_EPSILON.

    En gros, on a une histoire de poule et d'oeuf, qui confirme l'impression que j'ai qui est que l'on ne sait pas calculer EPSILON...

    Enfin, pour afficher correctement une valeur extrême, il faut utiliser un format scientifique :
    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
     
    #include<stdio.h>
    #include<math.h>
    #include<float.h>
     
    int main (void)
    {
       float x = 1;
       while (fabs(x / 2 - 0) >= FLT_EPSILON)
       {
          x = x / 2;
       }
       printf ("Calcule : %g\n", x);
       printf ("Defini  : %g\n", FLT_EPSILON);
       return 0;
     
    }
    Ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Calcule : 1.19209e-007
    Defini  : 1.19209e-007
     
    Press ENTER to continue.
    mais on savait déjà que FLT_EPSILON == FLT_EPSILON...

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je ne suis pas spécialiste des maths, mais je ne suis pas sûr qu'on puisse calculer EPSILON.
    On peut le calculer mais comme tout ce qui concerne les flottants, ce n'est pas aussi facile que ça peut en avoir l'air (le problème principal est qu'il y a des formats de flottants non binaires).

    C'est sans doute pour ça qu'il est défini dans <float.h> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FLT_EPSILON
    DBL_EPSILON
    LDBL_EPSILON
    C'est bien cela qu'il faut utiliser.

    D'autre part, on ne peut pas utiliser == ou != avec des flottants, parce que la représentation interne est une approximation.
    Mais si on peut. Il suffit de savoir ce qu'on fait. Au strict minimum, comparer des flottants pour voir si un est une copie de l'autre, c'est possible sans problèmes.

    Les flottants sont une approximation des réels, mais ils obéissent à des lois précises. Le tout est de savoir lesquelles et de les utiliser. Je déconseille d'utiliser les flottants tant qu'on a pas au moins une petite idée de ces lois... Chercher par exemple "What every computer scientist should know about floating point" ou bien la page de Kahan.

    Si on manipule les flottants comme des réels, ça marche les 3/4 du temps. Si on ajoute quelques petites règles comme celle qui suit (avec la correction), ça marche 9/10 du temps. Il faut au moins savoir quand est-ce qu'on ne se trouve pas dans les 10% restants...

    On utilise précisément une différence absolue (fabs()) que l'on compare à xxx_EPSILON.
    Pas encore... en attendant que quelqu'un modifie la FAQ: http://www.developpez.net/forums/sho...48&postcount=9 (le numeric_limits::epsilon de C++ correspond aux macros ci-dessus). Et il faut se rendre compte qu'on n'a plus une relation transitive...

    Le code donné n'essaie pas de calculer epsilon, qui n'est pas défini comme le plus petit nombre représentable supérieur à 0, mais comme la différence entre le plus petit nombre représentable supérieur à 1 et 1.

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

Discussions similaires

  1. [XL-2007] comment trouver une colonne dans une BD par son nom via VBA
    Par chikitin dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/06/2010, 08h52
  2. Comment trouver un contrôle par concaténation ?
    Par insane_80 dans le forum ASP.NET
    Réponses: 20
    Dernier message: 11/11/2009, 17h31
  3. Réponses: 2
    Dernier message: 21/09/2006, 09h41
  4. Comment modifier l'heure d'un fichier par calcul
    Par JLC2_ dans le forum Windows XP
    Réponses: 2
    Dernier message: 08/09/2006, 16h59
  5. Réponses: 6
    Dernier message: 12/05/2006, 15h20

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