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 :

PB de Precision à 10-22


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut PB de Precision à 10-22
    Bonjour à Tous

    Voici mon problème. Je veux calculer: 44.675811768*44.675811768
    dont le résultat est:
    1955.928157129767285824
    Le meilleur résultat que j'obtient avec Visual C++ est:
    1995.9281571997674
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void main(void)
    {
          double long a=44.675811768*44.675811768;
          printf("%4.19f\n",a);
    {
    J'ai lu beaucoup d'article sur les virgules flottantes, fixes, l'utilisation de: dec, fixed,scientific.
    Dans le FAQ, on parle de librairie. Mais je ne parviens pas à touver une solution ou à comprendre comment faire.
    Si vous savez ou je peux trouver la réponse avec un exemple, car c'est par l'exemple que je comprend le mieux.
    Je vous remercie de prendre le temps de m'aider.

    Bonne journée

  2. #2
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Essaie ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void main(void) 
    { 
          long double a= (long double) 44.675811768*44.675811768; 
          printf("%4.19f\n",a); 
    {
    Sinon, la multiplication est faite sur des doubles normaux, et ensuite traduite en long double (d'où perte de précision)

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Apparemment cela ne fonctionne pas, j'obtient toujours le même résultat.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    C'est tout à fait normal :
    Le type double codé sur 8 octets donne 16/17 chiffres significatifs.
    Tu peux y faire tout ce que tu veux, tu n'obtiendras pas mieux pour ce type.

    Si tu tiens à conserver toutes les décimales générées par les calculs, il faut t'orienter vers les bibliothèques de calcul en multiprécision (je n'en suis pas sûr, mais il me semble que GMP intègre le calcul multiprécision pour les flottants).

    Petite remarque au passage: dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void main(void)
    {
          double long a=44.675811768*44.675811768;
          printf("%4.19f\n",a);
    }
    évite d'utiliser des mots clés du langage comme long comme nom pour tes variables et autres choses définies par le programmeur.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par thewho
    Si tu tiens à conserver toutes les décimales générées par les calculs, il faut t'orienter vers les bibliothèques de calcul en multiprécision (je n'en suis pas sûr, mais il me semble que GMP intègre le calcul multiprécision pour les flottants).
    Une veille version de mpr(?), il vaut mieux chercher la derniere soi-meme.

    Petite remarque au passage: dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void main(void)
    {
          double long a=44.675811768*44.675811768;
          printf("%4.19f\n",a);
    }
    évite d'utiliser des mots clés du langage comme long comme nom pour tes variables et autres choses définies par le programmeur.
    long est un mot cle dans toute circonstance, ici aussi :-) Il a declare une variable a de type long double.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    long est un mot cle dans toute circonstance, ici aussi :-) Il a declare une variable a de type long double.
    Oups, j'ai lu un peu trop en diagonale !
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 376
    Points : 41 544
    Points
    41 544
    Par défaut
    Ben, il faut dire que dans cet ordre-là, c'est peu courant.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    merci pour votre aide,
    Il me manque juste une bibliothèques de calcul en multiprécision.
    Je ne parviens pas à trouver mon bonheur. Si vous avez un lien à me donner?
    Passer de Matlab à C++ ist nicht einfach .

  9. #9
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    C'est bon, j'ai trouvé.
    en plus sur le site
    http://c.developpez.com/bibliotheques/
    Je suis allé chercher midi à 14H.

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

Discussions similaires

  1. besoin de precision sur gluLookAt!
    Par bakonu dans le forum OpenGL
    Réponses: 3
    Dernier message: 25/04/2004, 19h05
  2. [langage] Substitution précise dans une chaine
    Par ATPase dans le forum Langage
    Réponses: 4
    Dernier message: 02/04/2004, 14h57
  3. precision sur le pilotage du port parallele
    Par fransouik dans le forum C++Builder
    Réponses: 18
    Dernier message: 26/02/2004, 13h28
  4. [VBA-E]Demande de précision sur les menus
    Par geffdenimes dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/06/2003, 10h46
  5. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 15h21

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