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 :

Fortran vers VBA : problème d'arrondi


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 94
    Par défaut Fortran vers VBA : problème d'arrondi
    Bonjour,

    Je souhaite traduire du code Fortran en VBA.
    Donc dans mes déclarations, j'ai effectué les traductions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Fortran         -->           VBA
    Integer*4  a    -->    dim a as long
    real*8 b        -->    dim b as double
    b=FLOAT(a)/100  -->  b=Cdbl(a)/100
    En comparant les résultats de mes 2 algos (plusieurs multiplications et divisions), j'ai "quasiment" le même résultat mais avec un problème d'arrondi que je n'arrive pas résoudre.

    Dans VBA, le type de données Double me donne le domaine suivant :
    -1,79769313486231E308 et -4,94065645841247E-324 pour les nombres négatifs et entre 4,94065645841247E-324 et 1,79769313486231E308 pour les positifs
    alors que Fortran me donne le suivant pour real*8 :
    -1.797693134862316D+308 à -2.225073858507201D-308, 0, 2.225073858507201D-
    308 à 1.797693134862316D+308 pour un réel double précision.
    Mon problème viendrait-il du fait que real*8 et double ne sont pas exactement le même type de données ?

    Si quelqu'un a déjà traduit du code fortran vers VBA, merci de me faire partager son expérience.

    Merci

  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
    Je n'ai pas d'expérience sur les exposants minimums et maximums permis. Je répondrai uniquement sur la précision.

    Citation Envoyé par sun19
    Fortran --> VBA
    Integer*4 a --> dim a as long
    real*8 b --> dim b as double
    b=FLOAT(a)/100 --> b=Cdbl(a)/100
    float(a), c'est un single et non un double. Essaie avec dble(a) en Fortran pour voir l'effet.

    Citation Envoyé par sun19
    Mon pb viendrait-il du fait que real*8 et double ne sont pas exactement le même type de données?
    real (8) et double devrait être la même chose. C'est plus une question de processeur que de language.

    Au delà du problème de float/dble indiqué plus haut, il y a le risque que VBA soit moins stricte sur la précision que Fortran et qu'il utilise la précision du processeur (80 bits et non 64) pour les calculs intermédiaires. C'est à vérifier. Si c'est la cause, il faudra alors briser les expressions VBA pour forcer la troncation dans des variables doubles.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 94
    Par défaut
    En comparant "pas à pas" les calculs de mes 2 algos, j'obtiens des résultats diffréents pour 2 formules.
    1ère formule :
    Fortran ---> vba
    INTEGER*4 Itemp ---> dim Itemp as Long
    if (Itemp.GT.0) Itemp=Itemp+25 ---> If Itemp > 0 Then Itemp = Itemp + 25
    if (Itemp.LT.0) Itemp=Itemp-25 ---> If Itemp < 0 Then Itemp = Itemp - 25
    Itemp=Itemp/50*5 ---> Itemp = Itemp / 50 * 5
    Qd Itemp=19000 au début du code, j'obtiens à la fin avec Fortran 1900 alors qu'avec vba j'ai 1902. La diiférence doit venir de l'opération :
    Itemp=Itemp/50*5
    mais je n'arrive pas à l'expliquer.

    2ème formule :
    Fortran ---> vba
    INTEGER*4 a,b ---> dim a as Long,b as long
    a = ( b / 1000 + 5 ) / 10 ---> a = ( b / 1000 + 5 ) / 10
    Si a=99754220, Fortran donne pour b 9975 alors que VBA donne 9976. Pourquoi?
    Merci

  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
    Problème simple.

    En Fortran, un entier divisé par un entier donne un entier. En VBA, un entier divisé par un entier donne un réel.

    L'expression
    a du sens en Fortran, mais pas en VBA, puisque la conversion en réel de la division rend l'expression équivalente a
    En VBA, tu dois donc prendre la partie entière de la division avant de multiplier par 5.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 94
    Par défaut
    Merci beaucoup
    Le pb venait de là il faut faire attention aux formules qui combinent des divisions et des multiplications.
    donc pour traduire en VBA le code Fortran suivant : on met .

    Merci encore

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

Discussions similaires

  1. Exécuter un programme Fortran depuis VBA ?
    Par zerbault dans le forum Fortran
    Réponses: 1
    Dernier message: 08/01/2007, 09h58
  2. [vba access] traduire du fortran en vba
    Par sun19 dans le forum VBA Access
    Réponses: 1
    Dernier message: 26/11/2006, 07h01
  3. Transposition Fortran vers C++
    Par LouPedro dans le forum Fortran
    Réponses: 10
    Dernier message: 20/10/2006, 11h24
  4. Nb de Pages d'un etat vers VBA Access
    Par the_6L20 dans le forum Access
    Réponses: 4
    Dernier message: 17/08/2006, 13h42
  5. PB traduction requete sql vers vba
    Par stan314 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 28/05/2006, 17h27

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