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

Macros et VBA Excel Discussion :

Conversion nombre décimal en virgule flottante IEEE 754 (exprimé en hexa)


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut Conversion nombre décimal en virgule flottante IEEE 754 (exprimé en hexa)
    Bonjour , j'ai réalisé une fonction permettant la conversion de nombre float en hexadécimal suivant le norme IEE754 , dont voici le principe :
    http://fr.wikipedia.org/wiki/IEEE_754

    Voici donc mon code :

    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
    26
    27
    28
    29
    30
    31
    32
      Function i3efp(num_in)
     
       s = 0
       If num_in < 0 Then s = 1
       For e = 0 To 255
       If 2 * 2 ^ (e - 127) > Abs(num_in) Then Exit For
       Next
       If e = 0 Then GoSub toosmal
       If e = 255 Then GoSub toobig
       F = (Abs(num_in) / (2 ^ (e - 127))) - 1
       F = 1 * Right(F, Len(F) - 2)
       F = (F * 10 ^ -Len(F)) / 2 ^ -23
       eh = hex(e)
       If Len(eh) < 2 Then eh = "0" & eh
       fh = hex(F)
       i3eb = s & h2b(eh) '9Bits
       fb = Right(h2b(fh), 23)
       If Len(fb) < 23 Then fb = String(23 - Len(fb), "0") & fb
       i3eb = i3eb & fb '32bits
       i3efp = b2h(i3eb)
       Exit Function
     
    toobig:
       i3efp = String(8, "F")
     
       Exit Function
     
    toosmall:
       i3efp = String(8, "0")
     
       Exit Function
    End Function




    Lorsque que je compile ,VB me dit :sub ou function non défini , surligne en jaune Function i3efp(num_in) et surligne en bleu h2b .
    Voila je suis bloqué à cause de ca , je me doute que ca doit être tout simple comme problème , mais je débute sous VB !!!
    Merci .

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 638
    Points : 34 347
    Points
    34 347
    Par défaut
    Salut,
    Ajoute en haut de ton code.
    Ensuite, commence à déclarer tes variables, parce que là ton code est illisible

    ta fonction h2b n'existe apparemment pas, sinon...

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Ok, peut tu me dire concrétement à quoi sert option explicit ?
    Merci beaucoup

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    F1 : "Instruction utilisée au niveau module pour imposer la déclaration explicite de toutes les variables de ce module."

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Merci lol , je viens d'apprendre nouveau truc avec la touche F1 !!
    J'ai déclaré mes variables , mais VB me demande de déclarer un tableau pour h2b ! Pourquoi ?
    Merci

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Bonsoir

    Si j'ai bien compris le code, H2B est une fonction qui convertit de l'hexa en binaire.

    A ma connaissance, cette fonction n'existe pas sous VBA. Il faut la créer soi-même.

    Par exemple, parmi d'autres solutions
    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
    Function H2B(NombreHexa As String)
        ' Convertit un nombre hexadécimal en nombre binaire
     
        Dim ChaineBinaire As String
        Dim ChaineHexa As String
        Dim i As Integer
        Dim ChaineRetour As String
        Dim Position As Integer
     
        ChaineBinaire = "0000000100100011010001010110011110001001101010111100110111101111"
        ChaineHexa = "0123456789ABCDEF"
     
        For i = 1 To Len(NombreHexa)
            Position = InStr(1, ChaineHexa, Mid(NombreHexa, i, 1)) - 1
            ChaineRetour = ChaineRetour & LTrim(Mid(ChaineBinaire, Position * 4 + 1, 4))
        Next i
        H2B = ChaineRetour
    End Function

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Oui , tu as tout compris , merci beaucoup
    Serait-il possible d'avoir la fonction binToHex? car je cherche mais ne trouve pas !
    Merci encore

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Voici

    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
    Function B2H(NombreBin As String)
        ' Convertit un nombre binaire en nombre hexadécimal
     
        Dim ChaineBinaire As String
        Dim ChaineHexa As String
        Dim ChaineTemp As String
        Dim i As Integer
        Dim ChaineRetour As String
        Dim Position As Integer
        Dim Reste As Integer
     
        ChaineBinaire = "0000000100100011010001010110011110001001101010111100110111101111"
        ChaineHexa = "0123456789ABCDEF"
     
        Reste = Len(NombreBin) Mod 4
        If Reste <> 0 Then NombreBin = String(4 - Reste, "0") & NombreBin
        For i = Len(NombreBin) To 1 Step -4
            ChaineTemp = Mid(NombreBin, i - 3, 4)
            Position = (8 * Mid(ChaineTemp, 1, 1)) + (4 * Mid(ChaineTemp, 2, 1)) + _
                (2 * Mid(ChaineTemp, 3, 1)) + (Mid(ChaineTemp, 4, 1))
            ChaineRetour = Mid(ChaineHexa, Position + 1, 1) & ChaineRetour
        Next i
        B2H = ChaineRetour
    End Function

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup

    J'ai une nouvelle erreur de compilation , Vb me dit : "erreur d'execution '9' ",l'indice n'appartient pas à la selection .Je vous mets mon code entier , qui est un peu long , lol .


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
      Public Function i3efp(num_in As Single)
     
      Dim s As Integer
      Dim F As Long
      Dim eh As Variant
      Dim fh As Variant
      Dim e As Byte
      Dim H2B() As String
      Dim i3eb As Long
      Dim fb As Long
      Dim B2H() As String
     
     
       s = 0
       If num_in < 0 Then s = 1
       For e = 0 To 255
       If 2 * 2 ^ (e - 127) > Abs(num_in) Then Exit For
       Next
     
       If e = 0 Then GoSub toosmall
       If e = 255 Then GoSub toobig
       F = (Abs(num_in) / (2 ^ (e - 127))) - 1
       F = 1 * Right(F, Len(F) - 2)
       F = (F * 10 ^ -Len(F)) / 2 ^ -23
       eh = hex(e)
       If Len(eh) < 2 Then eh = "0" & eh
       fh = hex(F)
       i3eb = s & H2B(eh) '9Bits
       fb = Right(H2B(fh), 23)
       If Len(fb) < 23 Then fb = String(23 - Len(fb), "0") & fb
       i3eb = i3eb & fb '32bits
       i3efp = B2H(i3eb)
       Exit Function
     
    toobig:
       i3efp = String(8, "F")
     
     Exit Function
     Return
     
    toosmall:
       i3efp = String(8, "0")
      Return
     
    Exit Function
     
    Return
     
    End Function
     
     
       Function H2B(NombreHexa As String)
     
        ' Convertit un nombre hexadécimal en nombre binaire
     
        Dim ChaineBinaire As String
        Dim ChaineHexa As String
        Dim i As Integer
        Dim ChaineRetour As String
        Dim Position As Integer
     
        ChaineBinaire = "0000000100100011010001010110011110001001101010111100110111101111"
        ChaineHexa = "0123456789ABCDEF"
     
        For i = 1 To Len(NombreHexa)
            Position = InStr(1, ChaineHexa, Mid(NombreHexa, i, 1)) - 1
            ChaineRetour = ChaineRetour & LTrim(Mid(ChaineBinaire, Position * 4 + 1, 4))
        Next i
        H2B = ChaineRetour
    End Function
     
     
    Function B2H(NombreBin As String)
        ' Convertit un nombre binaire en nombre hexadécimal
     
        Dim ChaineBinaire As String
        Dim ChaineHexa As String
        Dim ChaineTemp As String
        Dim i As Integer
        Dim ChaineRetour As String
        Dim Position As Integer
        Dim Reste As Integer
     
        ChaineBinaire = "0000000100100011010001010110011110001001101010111100110111101111"
        ChaineHexa = "0123456789ABCDEF"
     
        Reste = Len(NombreBin) Mod 4
        If Reste <> 0 Then NombreBin = String(4 - Reste, "0") & NombreBin
        For i = Len(NombreBin) To 1 Step -4
            ChaineTemp = Mid(NombreBin, i - 3, 4)
            Position = (8 * Mid(ChaineTemp, 1, 1)) + (4 * Mid(ChaineTemp, 2, 1)) + _
                (2 * Mid(ChaineTemp, 3, 1)) + (Mid(ChaineTemp, 4, 1))
            ChaineRetour = Mid(ChaineHexa, Position + 1, 1) & ChaineRetour
        Next i
        B2H = ChaineRetour
    End Function

    Et voici l'appelles de ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil1.Cells(2, 3) = i3efp(3.365)
    Je vais donc essayer de débugger moi même , mais si vous avez une idée du problème , je suis preneur .
    Merci

  10. #10
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Il faudrait préciser la ligne sur laquelle l'erreur survient.

  11. #11
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Quand je débugge en pas à pas détaillé , le programme se stoppe la:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i3eb = s & H2B(eh) '9Bits
    Merci de ton aide

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Correction de ma réponse

    En regardant ton code, je vois où est l'erreur.

    Il ne faut pas déclarer de variable H2B puisque c'est une fonction. Idem pour B2H

  13. #13
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Oui, merci par contre j'ai dû changer le type de variable de eh , fh et i3eb en string ,sinon lorsque je compilais il me sortait :Type d'argument Byref incompatible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function i3efp(num_in As Single)
     
      Dim s As Integer
      Dim F As Long
      Dim eh As String
      Dim fh As String
      Dim e As Byte
     
      Dim i3eb As String
      Dim fb As Long
    Donc maintenant mon programme compile mais ne me ressort pas le résulat attendu
    Exemple : je rentre 6.65 il me ressort 20747 alors qu'il devrait me resortir :
    40 D4 CC CD d'aprés un autre programme.(application windows) "je peux envoyer le programme pour celui que ca intéresse"

  14. #14
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Je n'ai pas analysé le code en lui-même pour ce qui est de la conversion d'un décimal en hexa. Je ne saurais pas me pencher dessus pour l'instant. Peux-tu tester avec des entiers pour vérifier?

    Dans Wikipedia, donnent-ils des exemples?

    Tu as aussi un forum algorithmes sur lequel tu auras des chances de trouver de l'aide pour ce point précis de ton problème

  15. #15
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Avec les entiers ,il me ressort des résulats surprenant :

    1---> OFE
    2---> 100
    3---> 100
    4---> 102
    5---> 102
    10--> 104


    Ensuite wikipédia donne en exemple (-118.625) qui donne : C2 ED 40 00
    Ce résulat je le retrouve avec mon appli windows mais sous VB ca me donne : 61747!
    MERCI , bON APPETIT

  16. #16
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Question idiote: A part pour la résolution d'un exercice demandé par un prof, quelle est l'utilité de cette fonction?

  17. #17
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut


    En faites , je travail sur un logiciel ,dont je dois lui envoyer des floats ! Ce sont des paramétres de jaugeur et de sondes , donc paramétre de niveaux , T° ,alarmes ect... Seulement le logiciel n'accepte pas qu'on lui envoi directement des floats ,on doit lui envoyer deux paquets de nombres hexa , et travaillant à partir d'excel et de Vb j'essaye donc de faire la conversion
    Voila , jsp avoir était assez clair.
    Si vous avez des idées ,je les acceptes volontiers

  18. #18
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    La précision, en 32 bits ou en 64 bits?

  19. #19
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Il me faut précision de 32 Bits .
    Merci

  20. #20
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut Nombre en virgule flottante norme IEEE 754
    Pour convertir un nombre en virgule flottante selon la norme IEEE 754, il faut d’abord pouvoir l’exprimer sous la forme (-)m x 2^e.

    Dans l'exemple que tu donnes (-128.625):
    - l'exposant est 6 car 2^6 (64) est la plus grande puissance de 2 inférieure à |-128.625|.
    - le multiplicande sera égal à -128.625 / 64 = -1,853515625. On laissera tomber le -1 pour ne retenir que 0,853515625. La conversion de ce nombre en binaire amène une perte de précision. Excel ne renvoie pas la même chaîne binaire que d'autres logiciels...
    Donc -128.625 = -1.853515625 x 2^6

    Après quoi, il faut découper les 32 bits selon le schéma suivant :
    - Le bit de poids fort exprime le signe (0 si positif, 1 si négatif)

    - Les huit bits suivants représentent e (l'exposant) en complément à 127 (pour faire simple, e + 127). En précision 32 bits, il faudrait tester que e + 127 n'est pas supérieur à 255, car on ne dispose que de 8 bits pour exprimer l'exposant. Dans l'exemple cité, l'exposant est 6. 6 + 127 = 133 qui donne en binaire 10000101

    - Les 23 bits suivants représentent m, le multiplicande. Ce nombre est tel que 1 <= nombre < 2. Selon la norme IEEE 754, on laisse tomber la partie entière qui est toujours 1. On peut donc exprimer uniquement la partie décimale du nombre. Pour cela, on utilise un algorithme identique à celui qui permet de transformer un nombre entier en binaire, mais avec les puissances négatives de 2, et on boucle juque 2 ^-23 ( en précision 32 bits).

    On colle alors les différentes chaînes binaires (signe & exposant & mantisse), et on découpe éventuellement en blocs de 4 ou on convertit en hexa.

    Voici les différentes fonctions qui permettent cela, car j’aime bien découper mes codes en petites fonctions simples à gérer et à réutiliser.

    Pour créer les fonctions, je suis parti du principe que celles-ci doivent pouvoir tourner indépendamment du logiciel qui utilise VBA (Ces fonctions pourraient tourner en VB6.0)

    Nous avons besoin d’une fonction qui convertit un entier en binaire (chaîne de caractères)
    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
    26
     
    Function EntierVersBinaire(ByVal Nombre As Long) As String
        ' Convertit un nombre entier en binaire
     
        Dim Exposant As Integer
        Dim Chaine As String
        Dim i As Integer
     
        'Calcul de l'exposant pour éviter les 0 non significatifs à gauche
        i = 0
        Do While Nombre >= 2 ^ i
            i = i + 1
        Loop
        i = i - 1
     
        For Exposant = i To 0 Step -1
            If Nombre >= 2 ^ Exposant Then
                Chaine = Chaine & "1"
                Nombre = Nombre - 2 ^ Exposant
                Else
                Chaine = Chaine & "0"
            End If
        Next
     
        EntierVersBinaire = Chaine
    End Function
    Nous avons besoin d’une fonction qui exprime en binaire un nombre décimal tel que
    0 <= nombre < 1 (pour exprimer en binaire la partie décimale du multiplicande)
    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
     
    Function DecimalVersBinaire(ByVal Nombre As Double) As String
        ' Renvoie l'expression binaire d'un nombre décimal
        ' Le nombre passé en paramètre doit être tel que 0 <= nombre < 1
        ' Les limites ne sont pas testées
     
        Dim Somme As Double
        Dim Nombre1 As Double
        Dim i As Integer
        Dim Chaine As String
     
        Nombre1 = Nombre
        For i = 1 To 23
            If Nombre > 2 ^ (-i) Then
                Chaine = Chaine & "1"
                Nombre = Nombre - 2 ^ (-i)
                Else
                Chaine = Chaine & "0"
            End If
        Next
        DecimalVersBinaire = Chaine
    End Function
    Nous avons besoin de la fonction B2H que j’ai donnée précédemment, qui convertira en hexa la chaîne des 32 signes du nombre décimal exprimé en binaire

    Nous avons enfin besoin d’une fonction qui renvoie la chaîne de 32 caractères binaires (composée du signe, de l’exposant sur 8 bits et de la mantisse sur 23 bits) convertie en hexa grâce à B2H().
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Function DecimalVersFloatHexa(ByVal Nombre As Single) As String
        ' Selon la nomre IEEE 754
        Dim i As Integer
        Dim Exposant As Integer
        Dim TropGrand As Boolean
        Dim Chaine As String
        Dim Multiplicande As Single
     
        ' "Calcul du signe
        If Nombre < 0 Then
            Chaine = 1
            Else
            Chaine = 0
        End If
     
        ' Recherche de l'exposant
            Do While Abs(Nombre) > 2 ^ i
            i = i + 1
        Loop
        i = i - 1
     
        'conversion de l'exposant
        Exposant = 127 + i
        If i > 255 Then TropGrand = True
     
        If Not TropGrand Then
            Chaine = Chaine & EntierVersBinaire(Exposant)
     
            'Calcul du multiplicande
            Multiplicande = Abs(Nombre) / 2 ^ i
            Multiplicande = Multiplicande - 1
            Chaine = Chaine & DecimalVersBinaire(Multiplicande)
            Chaine = B2H(Chaine)
            DecimalVersFloatHexa = Chaine
        End If
    End Function
    J’ai testé avec une série de nombres et j’arrive à des résultats concluants. Toutefois, tu verras parfois certaines différences avec des logiciels ou des abaques sur le net. Ces écarts sont dus aux degrés de précision qui varient d'un logiciel à l'autre.

    Ainsi, 128 s’écrit normalement en virgule flottante 43 00 00 00, alors que mon Excel renvoie 42 FF FF FF…

    Normalement, je pense que ces écarts ne sont pas significatifs, mais je ne connais pas le degré de précision requis par les instruments avec lesquels tu communiques.

    Attention toutefois!! Les calculs en virgule flottante amènent parfois à des surprises. Il faut pour bien faire ajouter des contrôles dans les fonctions proposées pour être certain d'envisager tous les cas de figure.

    Ok ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Conversion Image 32 bit virgule flottante en 8 bit niveaux gris
    Par magid31 dans le forum Général Java
    Réponses: 37
    Dernier message: 05/06/2012, 13h33
  2. [XL-2003] Conversion nombre décimal en heure
    Par anonymous1.0 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/02/2011, 12h54
  3. Conversion nombre décimal <-> binaire (signé et flottant)
    Par lecteur1001 dans le forum Simulink
    Réponses: 12
    Dernier message: 06/01/2011, 16h49
  4. Réponses: 6
    Dernier message: 16/05/2004, 19h03

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