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

Fortran Discussion :

Problème de précision


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Par défaut Problème de précision
    Bonjour,
    Je suis en train d'ecrire un programme pour lequel j'ai besoin d'une bonne precision de calcul. Or j'ai un probleme que je ne sais pas resoudre :
    Si je fais la chose suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    real p, q, r
     
    write(*,*) 'entrer la valeur de p'
    read(*,*) p
    q = 1 - p
    r = 1 - p - q
    write(*,*) p, q, r
    et que je rentre par exemple 0,8, il me ressort 0,800000012, 0,200000003 et -1,4900116E-008
    Alors evidemment les erreurs se cumulent et je me retrouve parfois avec des probabilites calculees dont les valeurs sont superieures a 1 !

    Comment peut-on faire pour que 0,2 soit egal à 0,2 et que 0,8 soit egal à 0,8 ? J'ai tente de declarer p, q, r en double precision, ca ne change rien.
    Est-ce dû au format du read ?

    Merci d'avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Citation Envoyé par lebelge Voir le message
    Comment peut-on faire pour que 0,2 soit egal à 0,2 et que 0,8 soit egal à 0,8 ? J'ai tente de declarer p, q, r en double precision, ca ne change rien.
    Est-ce dû au format du read ?

    Merci d'avance
    Le format du read n'a rien à voir.

    En double precision, tu as quand même dû réduire l'erreur...

    Mais le problème restera là, même en double precision. Ça découle du fait que ta fraction 8/10 n'est pas représentable en série finie de raison 1/2. Elle est égale à environ :

    8/10 = 1/2 + 1/4 + 0/8 + 0/16 + 1/32 + 1/64 + ...

    Les solutions possibles sont les suivantes :

    • Tu arrondis les résultats intermédiaires pour réduire le problème.
    • Tu utilises un package supportant une représentation décimale et non binaire. Il existe un module f90 (que je ne trouve plus) permettant de conserver la représentation des nombres rationnels sous forme de fraction.
    • Tu convertis tes calculs en entier avec un facteur d'échelle.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Par défaut
    Merci pour cette reponse. Je suis un peu sidere d'apprendre que le compilateur fortran utilise par defaut une representation binaire et pas decimale (mais peut-etre est-ce le cas de tous les compilateurs de tous les autres langages egalement). Comment se fait-il que la moindre calculatrice est en mode decimal alors qu'un objet aussi complexe qu'un compilateur ne l'est pas ?

    Bref, je ne peux pas utiliser de facteur d'echelle, ni installer de package vu que j'utilise g77 et je n'ai pas trouve de tel package.
    Par contre, je ne sais pas comment on fait pour arrondir ?

    Si je veux arrondir à la 4ème décimale disons, je peux par exemple multiplier par 10E4, prendre la partie entiere et rediviser par 10E4. Mais alors, 2 questions :

    1- le resultat de cette division devrait logiquement etre l'objet d'approximations dues a cette representation binaire. Je serais donc en train de generer une erreur de type different

    2- il doit certainement exister des methodes plus efficaces d'arrondir, non ?

    Merci d'avance

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Citation Envoyé par lebelge Voir le message
    Je suis un peu sidere d'apprendre que le compilateur fortran utilise par defaut une representation binaire et pas decimale (mais peut-etre est-ce le cas de tous les compilateurs de tous les autres langages egalement). Comment se fait-il que la moindre calculatrice est en mode decimal alors qu'un objet aussi complexe qu'un compilateur ne l'est pas ?
    Ce ne sont pas les compilateurs qui sont binaires, mais les processeurs. Et ça inclue les calculatrices. Elles sont simplement programmées en double precision, soit avec 15 chiffres significatifs, alors qu'elles n'en affichent que 10 ou 12.
    Citation Envoyé par lebelge Voir le message
    Bref, je ne peux pas utiliser de facteur d'echelle, ni installer de package vu que j'utilise g77 et je n'ai pas trouve de tel package.
    Par contre, je ne sais pas comment on fait pour arrondir ?

    Si je veux arrondir à la 4ème décimale disons, je peux par exemple multiplier par 10E4, prendre la partie entiere et rediviser par 10E4. Mais alors, 2 questions :

    1- le resultat de cette division devrait logiquement etre l'objet d'approximations dues a cette representation binaire. Je serais donc en train de generer une erreur de type different
    Tu as raison que la représentation interne d'un nombre arrondi à 4 décimales causera également problème si le problème provient d'un nombre arrondi à une décimale... La solution optimale dépend souvent du problème.
    Dans ton cas, tu soustrais des chiffres tellement près l'un de l'autre que la différence entre les nombres est plus petite que l'erreur de représentation. Le résultat est donc totalement aléatoire. L'idée est donc d'arrondir "q" et "r". Ça ne règlera pas le problème de représentation interne, mais ça règlera le problème des résultats aléatoires. Tu devras également limiter les décimales affichées au write si le 0.800000012 t'irrite...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Par défaut
    salut,

    Comment peut-on faire pour que 0,2 soit egal à 0,2 et que 0,8 soit egal à 0,8
    "0,2 pile" : 0.2E0 ou 0.2D0
    idem, 0,1234 "pile" : 0.1234E0 ou 0.1234D0

    E pour simple précision, D pour double.

  6. #6
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut !

    Les erreurs d'arrondi sont inévitables, du fait que chaque variable est stockée dans un nombre fini de bits. Cela fait l'objet de la norme ANSI/IEEE 754. En général, ça ne porte pas trop à conséquence, sauf si une variante prend une valeur qui devrait être zéro et qui, en fait est seulement très petite, comme ton r=-1,4900116E-008 . Il peut t'arriver deux types d'ennuis:



    Jean-Marc Blanc

Discussions similaires

  1. Problème de précision dans une requête
    Par Le Pharaon dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/08/2006, 14h16
  2. Réponses: 5
    Dernier message: 11/05/2006, 08h51
  3. Problème de précision avec FloatToStr
    Par Clorish dans le forum Langage
    Réponses: 9
    Dernier message: 06/12/2005, 15h38
  4. Réponses: 4
    Dernier message: 26/10/2005, 20h38
  5. [FLASH MX] Problème de "précision"
    Par will-scs dans le forum Flash
    Réponses: 2
    Dernier message: 03/07/2005, 00h31

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