Résultats de 1 à 4 sur 4

Sujet : Precision resultat sur multiplication

  1. #1

    Precision resultat sur multiplication

    Bonjour,

    Petite question d\'un debutant :

    Si je code :

    DOUBLE PRECISION, PARAMETER :: PI = &
    3.141592653589793238D0

    PRINT *, PI*.3

    ca me sort : 0.9424778335276408

    Maintenant, si je remplace la derniere ligne par :

    PRINT *, PI*.3D0

    j\'obtiens : 0.9424777960769379

    Donc un resultat sensiblement. Or moi je croyais naivement que Fortran faisait automatiquement la conversion du .3 en DOUBLE puisque PI est du type DOUBLE avant de faire la multiplication.

    D\'autant que pour moi, 0.3 n\'est pas un \"vrai\" DOUBLE puisque c\'est une valeur rentree a la main, et je ne pretends pas avoir la precision d\'un DOUBLE dans mes parametres \"experimentaux\".

    Merci a ceux qui voudront bien prendre le temps expliquer a un profane ce qui le laisse perplexe

    Remi.

  2. #2
    Membre MP
    Inscrit
    août 2013
    Localisation
    12100
    Messages
    687
    Je pense qu\'il faut savoir si ton fortran utilise une bibliothèque de sous programmes pour traiter les nombres réels, ou s\'il utilise la FPU (le processeur flottant).
    S\'il utilise une bibliothèque, le fonctionnement dépend de ces sous programmes et la manière dont ils traitent les réels et les entiers dans les calculs.
    S\'il utilise la FPU il faut en comprendre le fonctionnement. Dans quelques jours, je vais mettre dans les tuts de l\'assembleur une documentation détaillée de la FPU qui explique son fonctionnement. Cette documentation, je le pense est lisible même pour quelqu\'un qui ne fait pas d\'assembleur.
    La FPU travaille en interne sur des REAL de 10 octets, soit environ 20 chiffres significatifs décimaux. Le double Précision ou REAL8, n\'a qu\'une précision de 17 ou 18 chiffres décimaux.
    L\'opération interne est effectuée en REAL10, puis est arrondi en REAL8 pour passer dans le programme.
    Il y a aussi des instructions machine qui font intervenir les nombres entiers qui figurent dans les calculs et qui sont automatiquement convertis en REAL10 avant les calculs.
    Pour la suite je renvoie au document que je mettrai en ligne dans quelques jours.
    Pour savoir ce qui se passe dans ton FORTRAN, il faudrait imprimer la liste avec le code assembleur et regarder comment il travaille, ce qui permettrait de comprendre le problème...
    Si j\'arrive à touver un moment j\'essaierais avec un fortran IBM ancien sous DOS, et le POWER STATION version 4 de 1995.....
    A suivre
    Amicalement
    MOBY
    moby

  3. #3
    Merci pour cette reponse.

    Je ne suis pas sur d\'avoir tout compris mais ce que j\'en retiens, c\'est qu\'il ne faut pas faire confiance aux conversions de types faites automatiquement par Fortran.

  4. #4
    Membre MP
    Inscrit
    août 2013
    Localisation
    12100
    Messages
    687
    Ce n\'est pas aussi simple, et le problème est le même pout tous les langages.
    Un compilateur traduit les ordres du langage de haut niveau en langage machine.
    Si on veut comprendre, il faut prendre l\'option qui permet d\'imprimer l\'assembleur afin de comprendre finement comment travaille ton compilateur et pas suite ton programme...
    Amicalement
    Moby
    moby

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé