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 :

Résultat de Calcul perturbé


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 4
    Par défaut Résultat de Calcul perturbé
    Bonjour,

    dans l'exemple qui suit, d'où viennent les perturbations dans le calcul ?

    Real A,Y
    Y = 1000.2
    A = Y - 1000.0
    PRINT *, A ! Prints 0.200012

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Par défaut
    Elles viennent de l'arrondi machine à ce qu'il me semble.

    Si tu souhaites un résultat plus précis, il faut déclarer ton réel en double précision :
    REAL(KIND=8) :: A,Y
    Mais tu auras encore (je pense) le même soucis à ceci près qu'il devrait toucher la 15e décimale.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 4
    Par défaut
    Citation Envoyé par Marlan Voir le message
    Elles viennent de l'arrondi machine à ce qu'il me semble.

    Si tu souhaites un résultat plus précis, il faut déclarer ton réel en double précision :

    Mais tu auras encore (je pense) le même soucis à ceci près qu'il devrait toucher la 15e décimale.
    Bonjour,

    Merci pour la réponse, j'ai déjà testé la double précision(*8) et la quad(*16), et le problème est toujours le même. Y a-t-il un moyen pour éliminer ces perturbations ? une option peut-être sur le compilateur Intel visual fortran.

  4. #4
    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!
    Il ne s'agit pas d'un problème de programmation ou de langage: c'est le processeur de ton ordinateur qui applique la norme IEEE 754, parce que les nombres réels sont stockés et traités avec un nombre fini de bits.
    Jean-Marc Blanc

    PS: Selon moi, ça devrait être le sujet de la première leçon d'un cours pour débutants en informatique.

  5. #5
    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
    En utilisant des doubles ou des quads, tu corriges en partie seulement le problème : tu continues à assigner des simples real 1000.2 et 1000.0 à un double ou un quad. Ces derniers vont simplement conserver plus de décimales imprécises, ils ne vont pas inventer / corriger la précision.

    Pour vraiment corriger, tu dois assigner des constantes doubles ou quads.

    Comment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Real (8) A,Y
    Y = 1000.2d0
    A = Y - 1000.0d0
    PRINT *, A ! Prints 0.200012
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    integer, parameter :: rk = selected_real_kind(15)
    real (rk) A,Y
    Y = 1000.2_rk
    A = Y - 1000.0_rk
    PRINT *, A ! Prints 0.200012

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 4
    Par défaut
    Citation Envoyé par Sylvain Bergeron Voir le message
    En utilisant des doubles ou des quads, tu corriges en partie seulement le problème : tu continues à assigner des simples real 1000.2 et 1000.0 à un double ou un quad. Ces derniers vont simplement conserver plus de décimales imprécises, ils ne vont pas inventer / corriger la précision.

    Pour vraiment corriger, tu dois assigner des constantes doubles ou quads.

    Comment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Real (8) A,Y
    Y = 1000.2d0
    A = Y - 1000.0d0
    PRINT *, A ! Prints 0.200012
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    integer, parameter :: rk = selected_real_kind(15)
    real (rk) A,Y
    Y = 1000.2_rk
    A = Y - 1000.0_rk
    PRINT *, A ! Prints 0.200012
    Bonjour,

    Merci pour vos réponses. La commande utilisée est pour les versions de Fortran 95 et ultérieures, je dois utiliser le Fortran 77 pour une raison particulière. Il est vrai comme je l'ai lu plus haut que ces perturbations viennent de la conversion en binaire des valeurs en virgule flottante, de plus, c'est le fait que les deux valeurs soient très proches l'une de l'autre qui fait ça.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/11/2007, 07h03
  2. Résultat du calcul =Mod(-1, 10) ?
    Par MiJack dans le forum Excel
    Réponses: 13
    Dernier message: 21/06/2007, 14h50
  3. Affichage d'un résultat de calcul dans une fenêtre
    Par Marcusss dans le forum Interfaces Graphiques
    Réponses: 17
    Dernier message: 03/04/2007, 12h23
  4. Réponses: 5
    Dernier message: 22/11/2006, 16h06
  5. recupération d'un résultat de calcul
    Par Toff !!!!! dans le forum Access
    Réponses: 3
    Dernier message: 17/09/2005, 16h53

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