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 augmenter la précision des réels ?


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 18
    Par défaut Comment augmenter la précision des réels ?
    Hi,
    Je fais souvent des calculs numériques en fortran, et j'utilise le type REAL*8 qui gère des nombres réels avec 16 chiffres après la virgule, mais je ne sais pas comment faire pour avoir cette même précision en C ou C++, alors qui peut m'aider.
    Merci d'avance.

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 79
    Par défaut
    Un type float est suffisant pour des décimaux avec 16 chiffres après la virgule...

  3. #3
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 18
    Par défaut
    Merci pour votre réponse, mais lorsque j'utilise les types float, double ou long double en DevC++ ou sous unix je n'arrive pas avoir cette précision de 16 chiffres après la virgule.

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    La précision des nombres réels est approchée. Elle dépend du nombre de positions décimales, suivant le type de réel elle sera au moins :

    * de 6 chiffres après la virgule pour le type float
    * de 15 chiffres après la virgule pour le type double
    * de 17 chiffres après la virgule pour le type long double
    Est ce que tu as essayé le type long double?

    [Edit]
    Oups désolé j'avais pas vu que tu l'avais essayé.
    C'est bizarre que ca marche pas.
    De toute facon les chiffres à virgules sont les pires choses pour un ordinateur.
    Le float est une sale invention ^^
    [/Edit]

  5. #5
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 68
    Par défaut
    Citation Envoyé par zaim
    Merci pour votre réponse, mais lorsque j'utilise les types float, double ou long double en DevC++ ou sous unix je n'arrive pas avoir cette précision de 16 chiffres après la virgule.
    A quoi vois tu que tu n'as pas la bonne précision?

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Regarde la doc de printf ou des streams selon comment tu programmes pour afficher toutes les décimales d'un float ou d'un double.

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Pas confondre mantisse avec nombre de chiffres après la virgule.
    Sinon, en C et C++, .... les précisions des divers types numériques varie d'un compilo/OS à l'autre.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Citation Envoyé par Luc Hermitte
    Sinon, en C et C++, .... les précisions des divers types numériques varie d'un compilo/OS à l'autre.
    franchement je ne pense pas : les flottants suivent les normes IEEE, d'ailleurs les calculs sont faits par des processeurs dédiés, les compilateur produisent du code les utilisant et ils n'ont pas le choix

    Bref classiquement un float est sur 32 bits et un double sur 64 bits, tout compris bien-sur

    Regarde la doc de printf ou des streams selon comment tu programmes pour afficher toutes les décimales d'un float ou d'un double.
    effectivement il ne faut pas forcement croire ce que l'on voit, un affichage avec 1 chiffre avant la virgule et 3 decimales n'indique pas que la précision en base 10 soit de 4 chiffres !

    Pour un double sur 64 bits : 1 bit de signe, 11 d'exposant et 52 bits de mantisse, or 2^52 = 4.5e+15

    tu as ta réponse au niveau précision (mais pas en chiffres après la virgule, ce qui ne veut rien dire tant que l'on ne sait pas ce qu'il y a avant la virgule )
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par bruno_pages
    Citation Envoyé par Luc Hermitte
    Sinon, en C et C++, .... les précisions des divers types numériques varie d'un compilo/OS à l'autre.
    franchement je ne pense pas : les flottants suivent les normes IEEE, d'ailleurs les calculs sont faits par des processeurs dédiés, les compilateur produisent du code les utilisant et ils n'ont pas le choix
    En général, oui, même si rien ne l'oblige. Je pense que sur de très vieilles machines, on doit pouvoir trouver des compilateurs C++ ne respectant pas ce standard. numeric_limits::is_iec559 donne des infos à ce sujet.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par Luc Hermitte
    Pas confondre mantisse avec nombre de chiffres après la virgule.
    Sinon, en C et C++, .... les précisions des divers types numériques varie d'un compilo/OS à l'autre.
    La mantisse n'est-elle pas les chiffres après 0. ?

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Miles
    La mantisse n'est-elle pas les chiffres après 0. ?
    Non, elle représente les chiffres significatifs. Avec l'exposant qui lui est appliqué, ta mantisse peut très bien se retrouver 15 chiffres derrière la virgule tout comme 20 devant.

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    J'ai oublié de précisé que je parlais avec l'exposant derrière. La virgule n'est pas toujours pour moi le séparateur entre l'unité et les chiffres avant, surtout dans le cas de l'écriture scientifique.

  13. #13
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 18
    Par défaut
    W A W Www,
    c'est fort !!! merci à tous, sachez que le problème n'est pas réglé. Je précise qu'avec FORTRAN je pouvait avoir 16 chiffres après la virgule avec un exposant très grand, alors y a t'il une réponse.

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Mais tu n'as pas cette précision comment ? Tu as un exemple à nous montrer ?

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A priori l'équivalent de REAL*8 en C++ est le type double. Tu ne devrais donc avoir aucun souci de précision.

    La vraie question, et à laquelle tu n'as pas répondu, c'est

    A quoi vois tu que tu n'as pas la bonne précision?

  16. #16
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 18
    Par défaut
    Merci pour tous,
    J’ai eu une réponse dans un autre forum, et apparemment le compilateur gère bien les nombres de type double ou long double mais le problème réside dans l'affichage des chiffres après la virgule.
    Voici un exemple:
    #include <stdio.h>
    int main()
    {
    double a=1./3.;
    printf("a=%.16g\n",a);
    }


    et il donne le bon résultat.
    Excusez moi pour le dérangement. Problème réglé.

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut

    Donc c'était bien la doc de printf

  18. #18
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 18
    Par défaut
    c'est exacte, voila ce qui arrive lorsqu'on s'habitue au langage FORTRAN, il suffit de write(*,*) et vous avez l'affichage de 16 chiffres après la virgule.

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

Discussions similaires

  1. Comment tester la validité des nombres réels ?
    Par linda80 dans le forum Langage
    Réponses: 4
    Dernier message: 15/10/2007, 17h47
  2. Comment augmenter la durée des sessions?
    Par dolf13 dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2007, 17h38
  3. Réponses: 4
    Dernier message: 25/04/2007, 20h18
  4. Réponses: 17
    Dernier message: 14/06/2006, 17h20

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