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 des long double


Sujet :

C++

  1. #21
    Invité
    Invité(e)
    Par défaut
    Je pense que tous les intervenants savent de quoi il en retourne avec les problèmes de représentation des floats.
    Moi aussi, je pensais cela, mais ça ne semble pas être le cas.

    Un long double n'a qu'une précision de 7 chiffres après la virgule.
    Si on ajoute 0.01 à cette valeur : 0.0034561 on obtient 0.1334561 et non
    0.0034562 pour obtenir cette dernière il faudrait faire cela : 0.0000001 et le tour est joué.
    Un long double a une précision de 19 chiffres significatifs, quelque soit la position de la virgule. La représentation est une chose, sans grand intérêt, qui va s'amuser à afficher un nombre d'une quinzaine de chiffres? Parcontre, ce qui est important, ce sont les calculs. Je pense même que tout essai de démonstration avec des impressions est sans valeur, parce que les fonctions printf ou cout sont passées par là. La seule vérification valable est du type
    if( ...) on imprime BON
    else on imprime FAUX.

  2. #22
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    Citation Envoyé par Pierre Dolez Voir le message
    Parcontre, ce qui est important, ce sont les calculs. Je pense même que tout essai de démonstration avec des impressions est sans valeur, parce que les fonctions printf ou cout sont passées par là. La seule vérification valable est du type
    if( ...) on imprime BON
    else on imprime FAUX.
    Merci de développer votre boucle if-else, ce n'est pas clair.

  3. #23
    Invité
    Invité(e)
    Par défaut
    Le problème est beaucoup plus simple :
    ON NE DOIT PAS COMPARER DES FLOTTANTS AVEC L'OPERATEUR '==".
    Toute autre discussion est stérile. En particulier le test par des impressions avec n chiiffres.
    Les deux exemples cités, et tirés du document précité, peuvent aider à la compréhension.
    L'explication mathématique consiste à dire que si on compare la représentation en flottants de variables réelles, on ne compare pas les réels mais les flottants, or ce sont les réels que l'on devrait comparer, ce qui est généralement impossible. Il s'agit là d'une démonstration et non d'un exemple.
    Voir http://www.developpez.net/forums/d96...nces-moyennes/

  4. #24
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    Citation Envoyé par Pierre Dolez Voir le message
    Le problème est beaucoup plus simple :
    ON NE DOIT PAS COMPARER DES FLOTTANTS AVEC L'OPERATEUR '==".
    Toute autre discussion est stérile. En particulier le test par des impressions avec n chiiffres.
    Vous n'avez pas répondu à ma question.
    Par quel test "if-else" remplacez-vous l'affichage ou la lecture au debogueur d'un flottant?

    Merci pour le lien.

  5. #25
    Invité
    Invité(e)
    Par défaut
    Par quel test "if-else" remplacez-vous l'affichage ou la lecture au debogueur d'un flottant?
    Soit on affiche un flottant pour voir sa valeur, faire un listing de résultat, ou tout autre chose de ce genre, alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILE *Fic=fopen("NomFic.txt","wt");
    ...
    float val;
    ...
    fprintf(Fic,"Le résultat = %0.2f \n",val);
    ...
    Soit on veut comparer un flottant à un autre, c'est à dire si les valeurs réelles qu'ils représentent sont "proches", alors
    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
    float val1;
    float val2;
    ...
    // différents calculs
    ...
    float tol=1.E-3;  // c'est à dire 1 mm
    if (fabs(val1-val2) < tol)
    {
      //val1 et val 2 sont à considérer comme égale 
    ...
    }
    else
    {
      //val1 et val 2 sont à considérer comme différentes
    ...
    }
    Je ne vois pas d'autre cas de figure.

  6. #26
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Soit on affiche un flottant pour voir sa valeur, faire un listing de résultat, ou tout autre chose de ce genre, alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILE *Fic=fopen("NomFic.txt","wt");
    ...
    float val;
    ...
    fprintf(Fic,"Le résultat = %0.2f \n",val);
    ...
    Merci d'avoir réhabiliter l'affichage malgré votre égarement précédent.

    Citation Envoyé par Pierre Dolez Voir le message
    Je pense même que tout essai de démonstration avec des impressions est sans valeur, parce que les fonctions printf ou cout sont passées par là.

    Ensuite, lorsqu'on compare deux flottants suivant une tolérance, il faut faire extêmement attention.
    L'erreur typique, vous la donnez :

    Citation Envoyé par Pierre Dolez Voir le message
    Soit on veut comparer un flottant à un autre, c'est à dire si les valeurs réelles qu'ils représentent sont "proches", alors
    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
    float val1;
    float val2;
    ...
    // différents calculs
    ...
    float tol=1.E-3;  // c'est à dire 1 mm
    if (fabs(val1-val2) < tol)
    {
      //val1 et val 2 sont à considérer comme égale 
    ...
    }
    else
    {
      //val1 et val 2 sont à considérer comme différentes
    ...
    }
    Je ne vois pas d'autre cas de figure.
    Que se passe-t-il si val1 et val2 sont inférieurs à tol?

    Heureusement, la faq est là.

  7. #27
    Invité
    Invité(e)
    Par défaut
    Que se passe-t-il si val1 et val2 sont inférieurs à tol?
    Je ne comprend pas la question.
    Si val1 et val2 sont inférieur à tol, fabs(val1-val2) sera aussi inférieur à tol.
    Petit point que je n'ai pas précisé, tellement il me paraissait évident : les calculs sont faits dans un environnement précis. S'il s'agit de coordonnées terrestre, l'unité est le mètres et la précision recherchée est de l'ordre du mm.
    Si on travaille en coordonnées géographiques, la précision recherchée sera de l'ordre de E-6 (ou plutôt on affichera 6 chiffres après la virgule).
    Je ne sais pas si l'article de la FAQ cité est nouveau, mais on m'avait déjà renvoyé sur la FAQ, l'explication était beaucoup plus détaillée, mais expliquait en gros le même chose. J'avoue que je ne comprend pas très bien où vous voulez en venir. Ce sujet a déjà été traité il n'y a pas très longtemps, Je vous ait dit alors qu'il fallait arrêter sur cette discussion "stérile". J'ai eu l'immense avantage de me voir attribuer le titre de Candide.
    [MP]PS en réponse à une de vos questions, effectivement, ma question et surtout votre réponse n'apporte rien au sujet traité, c'est justement la raison pour laquelle je vous l'avais posée par MP. [/MP]

  8. #28
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    [MP]PS en réponse à une de vos questions, effectivement, ma question et surtout votre réponse n'apporte rien au sujet traité, c'est justement la raison pour laquelle je vous l'avais posée par MP. [/MP]
    Vous êtes malhonnête!
    Vous me l'avez posée ici!

  9. #29
    Invité
    Invité(e)
    Par défaut
    Toutes mes excuses, je me suis trompé, c'est probablement le terme "message" qui m'a fourvoyé. Si vous pensez réellement que c'est de la malhonnêteté, nous ne correspondrons plus.

Discussions similaires

  1. Affichage long double
    Par slate dans le forum C++
    Réponses: 5
    Dernier message: 07/02/2006, 19h04
  2. requette qui renvoi des ligne double
    Par fehmitn dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/09/2004, 23h36
  3. Réponses: 4
    Dernier message: 12/09/2003, 12h38
  4. abs pour un long double
    Par barthelv dans le forum C
    Réponses: 2
    Dernier message: 23/07/2003, 17h16
  5. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 21h22

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