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

WinDev Discussion :

Formule Codage de 2 entiers 16 bits en 1 réel 32 bits [WD17]


Sujet :

WinDev

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut Formule Codage de 2 entiers 16 bits en 1 réel 32 bits
    Bonjour,

    Je ne peux remonter d'un automatisme que des données 16 bits.
    Dans la mémoire de l'automate, la valeur du réel %MF0 (32 bits) est codée en 2 entiers (16bits chacun) %MW0 et %MW1.

    Je remonte bien les valeurs de %MW0 et %MW1 dans mon windev.

    Quelle est la formule ou le codage pour reconstituer la valeur %MF0 dans mon windev à partir des %MW0 et %MW1 récupérés.
    NB: la marque de l'automate n'a aucune signification; c'est surtout une question sur le codage des entiers et des réels.

    Merci par avance de votre aide.

    Pour info, j'avais réussi avec Labview et des blocs de retournements de bits et de conversion de données mais je n'arrive pas à l'appliquer avec windev.

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour, tu ne nous dis pas à quoi doit ressembler ton nombre final par rapport à tes 2 entiers...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Bonjour,

    juste pour être sûr de bien comprendre, tu as la partie décimale d'un côté et la partie entière de l'autre ?

    à bientôt,

    Nicolas

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    Bonjour, tu ne nous dis pas à quoi doit ressembler ton nombre final par rapport à tes 2 entiers...
    à un réel

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par Nicolas_Jeanneau Voir le message
    Bonjour,

    juste pour être sûr de bien comprendre, tu as la partie décimale d'un côté et la partie entière de l'autre ?

    à bientôt,

    Nicolas
    Non.

    Un réel est codé sur 32 bits. Il me semble que le bit de poids fort est le signe (+ ou -) ... etc

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    En fait, ma question se résume à :

    J'ai 32 bits, quelle est la valeur du réel qui en résulte.

  7. #7
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Celle que tu veux...

    Si tu ne sais pas sous quelle forme est codée ton réel, tu ne peux pas le convertir. Je ne connais pas labview, mais tu qd même lui dire quelque part ou se trouve la virgule dans ton nombre. (Format Mantisse + exposant pour être précis).
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    C'est la norme IEEE.
    J'avais oublié de le préciser mais cela me semblait évident en informatique pour coder entier, réel...etc en binaire.

    Trouvé sur le net :

    Ainsi le codage d'un réel en binaire se fait sous la forme suivante :

    seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm

    le s représente le bit relatif au signe
    les e représentent les bits relatifs à l'exposant
    les m représentent les bits relatifs à la mantisse


    Voila moi j'ai les 32 bits, ils faut que j'en tire la valeur du réel.
    Les blocs Labview savent faire cette conversion mais en windev...

    Merci pour vos aides.

  9. #9
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Faut se le faire à l'os !!!

    Tu peux t'en sortir avec le EtBinaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // le signe
    s est booleen = etbinaire(MW0, puissance(2,16)) = 1 // vrai ou faux
    // L'exposant 
    exp est entier = 0 
    pour i = 15 a 8 pas -1
       exp += etbinaire(MW0, puissance(2,i))
    fin
    Partie0Decimal est entier = 0
    pour i = 7 a 1 pas -1
       Partie0Decimal  += etbinaire(MW0, puissance(2,i))
    fin
    Partie0Decimal * puissance(2,16) // décalage à gauche pour remettre la bonne valeur
     
    Partie1Decimal est entier = 0
    pour i = 16 a 1 pas -1
       Partie1Decimal  += etbinaire(MW1, puissance(2,i))
    fin
     
    NombreEntier est entier = Partie0Decimal + Partie1Decimal
     
    NombreReel est reel // ou monétaire
     
    NombreReel = NombreEntier * puissance(1,exp)
     
    si pas s alors NombreReel = NombreReel *-(1)
    A valider par plein de tests, bien sûr...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    Faut se le faire à l'os !!!

    Tu peux t'en sortir avec le EtBinaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // le signe
    s est booleen = etbinaire(MW0, puissance(2,16)) = 1 // vrai ou faux
    // L'exposant 
    exp est entier = 0 
    pour i = 15 a 8 pas -1
       exp += etbinaire(MW0, puissance(2,i))
    fin
    Partie0Decimal est entier = 0
    pour i = 7 a 1 pas -1
       Partie0Decimal  += etbinaire(MW0, puissance(2,i))
    fin
    Partie0Decimal * puissance(2,16) // décalage à gauche pour remettre la bonne valeur
     
    Partie1Decimal est entier = 0
    pour i = 16 a 1 pas -1
       Partie1Decimal  += etbinaire(MW1, puissance(2,i))
    fin
     
    NombreEntier est entier = Partie0Decimal + Partie1Decimal
     
    NombreReel est reel // ou monétaire
     
    NombreReel = NombreEntier * puissance(1,exp)
     
    si pas s alors NombreReel = NombreReel *-(1)
    A valider par plein de tests, bien sûr...


    Merci frenchsting pour ton courage.
    Je pensais qu'il existait une fonction ou alors comme pour Labview on pouvait s'en sortir avec 3 blocs de fonctions.

    Apparemment Windev n'est pas sur le terrain scientifique ou automation.
    Peut être que la version 20 ajoutera ce type de fonction de conversion de type de données...

    J'essaierai de tester ton code pour marquer la discussion 'Résolue'.
    Encore Merci.

  11. #11
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Si il y a "lab" dans labview, c'est à mon avis parce que c'est orienté labo. Windev est généraliste...

    et encore, imagine sans EtBianire, il faudrait utiliser et comparer toutes les puissances de 2

    Mon code est un peu "sauvage" :
    Pour le signe, on doit pouvoir faire mieux.
    Pour l'exposant, remplace ma boucle des 8 puissances de 2 par la "vraie" valeur de cette somme...

    Par contre, j'ai un doute pour l'exposant, s'il peur être négatif ou pas...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    Je vais quand même essayé de regarder avec la fonction Transfer

    Cette fonction marche avec des octets, mais ça doit être faisable en décomposant mes mots 16 bits en 2 octets...

  13. #13
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Pas sûr que ça marche avec transfert. Cette fonction va juste te "coller" les 2 variables.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Bonjour à tous,

    Citation Envoyé par davcaz Voir le message
    C'est la norme IEEE.
    J'avais oublié de le préciser mais cela me semblait évident en informatique pour coder entier, réel...etc en binaire.

    Trouvé sur le net :

    Ainsi le codage d'un réel en binaire se fait sous la forme suivante :

    seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm

    le s représente le bit relatif au signe
    les e représentent les bits relatifs à l'exposant
    les m représentent les bits relatifs à la mantisse


    Voila moi j'ai les 32 bits, ils faut que j'en tire la valeur du réel.
    Les blocs Labview savent faire cette conversion mais en windev...
    N'oublie pas d'être précis, car si tu regardes le site web IEEE Xplore, tu constateras qu'il y actuellement 1137 normes en vigueur publiées par l'IEEE
    http://ieeexplore.ieee.org/xpl/stand...sp?reload=true

    D'après ce que tu décris, il s'agit de la représentation d'un nombre à virgule flottante en binaire, en simple précision, décrit par la norme IEEE 754.

    C'est aussi cette norme qui est utilisée pour coder les réels (flottants) dans WinDev.

    Citation Envoyé par davcaz Voir le message
    Je vais quand même essayé de regarder avec la fonction Transfer

    Cette fonction marche avec des octets, mais ça doit être faisable en décomposant mes mots 16 bits en 2 octets...
    Citation Envoyé par frenchsting Voir le message
    Pas sûr que ça marche avec transfert. Cette fonction va juste te "coller" les 2 variables.
    Ici le nombre flottant est codé sur 4 octets.
    Et tu récupère 2 mots de 2 octets
    Supposons que %MW0 et %MW1 soient respectivement le mot de poids faible et le mot de poids fort.
    Le transfert vers une variable de type réel sur 4 octets, en se câlant sur le bon mot à écrire, devrait faire l'affaire.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    Bravo OnePoint.

    Rendons à César... voila un bout de code de Pat Biker qui donne à partir de 4 octets la valeur du réel associé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    str4 est une structure
    octet4 est un entier sans signe sur 1 octet
    octet3 est un entier sans signe sur 1 octet
    octet2 est un entier sans signe sur 1 octet
    octet1 est un entier sans signe sur 1 octet
    FIN
     
    R est un réel sur 4 octets
     
    vstr4 est un str4
     
    vstr4:octet4 = 0x00
    vstr4:octet3 = 0x00
    vstr4:octet2 = 0xE8
    vstr4:octet1 = 0x41
     
    Transfer(&R, &vstr4, 4)
     
    Info(R, "CQFD") // Affiche 29


    Merci à OnePoint et Pat Biker, la discussion est résolue.

  16. #16
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Je me permets de répondre même si la discussion est résolue ^^

    La solution proposé est bonne, mais me semble un peu complexe. La suivante est à priori équivalente, mais plus concise. Cette solution ne change pas grand chose par rapport à la précédente, si ce n'est en performance. Sur un grand nombre de transformation l'impact doit être sensible. Par contre, il faudrait tout de même tester un peu plus que sur une valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Info(GetRealFromInt(0x0000, 0x41e8))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROCEDURE GetRealFromInt(i1 est un entier sur 2 octets sans signe, i2 est un entier sur 2 octets sans signe) : réel sur 4 octets
    r est un réel sur 4 octets
     
    Transfer(&r, &i1, 2)
    Transfer(&r+2, &i2, 2)
     
    RENVOYER r
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  17. #17
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Effectivement, l'utilisation de Transfer bat tous les records...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 202
    Points : 79
    Points
    79
    Par défaut
    Merci DelphiManiac pour ce dernier code.

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

Discussions similaires

  1. formule mathématique tableau d'entiers
    Par devhercule dans le forum Mathématiques
    Réponses: 6
    Dernier message: 06/01/2013, 02h04
  2. Addition d'entier signé sur 64 bits sur un proc 32 bits
    Par SoJaS dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 10/08/2010, 07h22
  3. Réponses: 5
    Dernier message: 14/03/2008, 17h01
  4. entiers 64 bits et operateurs sur les bits
    Par xantares dans le forum C
    Réponses: 9
    Dernier message: 25/03/2007, 17h23
  5. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25

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