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 à virgule flottante IEEE 754 en décimal


Sujet :

Macros et VBA Excel

Vue hybride

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 196
    Par défaut Conversion nombre à virgule flottante IEEE 754 en décimal
    Bonjour,

    J'ai recréé mes fonction en vba:

    - DECBIN : Conversion decimal en binaire
    - BINDEC : Conversion binaire en decimal
    - REEL : conversion reel en binaire

    et ma macro de conversion :

    - testConversion

    et ma macro de test : test3



    Le but est de convertir un nombre à virgule flottant (REEL) en binaire 32 bit ( feuille Export_REAL EX / CELLULE B3), puis en décimal dans deux cellules de 16 bits ( Feuille EXPORT unIT ex : CELLULE B3 et C3). d'après la norme IEEE 754. les feuilles dans les 3 formats sont issus d'un seul tableau d'automate exporté en décimal,en hexadécimal et en réal ( nombre à virgule flottante)

    donc Export_REAL!B3 = Export_UINT!B3 + Export_UINT!C3 = Export_UINT_BCD!B3 + Export_UINT!C3

    Je n'arrive pas partir de mes valeurs de la feuille Export_REAL et trouvé les valeur des autres feuilles, de la feuille UINT pour commencer Je rencontre un problème de conversion avec les nombres décimaux supérieur à 7 chiffres avant la virgule.
    je me vérifie avec ce site http://www.binaryconvert.com/convert_float.html
    voir la Feuil1 avec la comparaison des résultats du site et mes fonctions marco VBA, en rouge les différences.

    Auriez vous une idée d'ou pourrait venir le problème, précision d'excel? arrondi? , formule ?
    Je sèche MERCI !

    edit : suppression de la pièce joint en macro.

    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    Option Explicit
     
    Public Const F_DM = "Table_Echange"
    Public Const F_UINT = "Export_UINT"
    Public Const F_UINTBCD = "Export_UINT_BCD"
    Public Const F_REAL = "Export_REAL"
    Public Const F_MAJ = "SUIVI_MODIF"
    Public Const F_LEG = "LEGENDE"
     
    Public Const Ndepart = 2
    Public Const Categorie1 = "Télé-Réglage"
    Public Const T_UINT = "UINT"
    Public Const T_UINT_BCD = "UINT_BCD"
    Public Const T_REAL = "REAL"
     
    Public Const ColDM = "G"
    Public Const ColReg = "P"
     
    '==== Conversion decimal en binaire
    Function DECBIN(Val As Variant)  '
     
    Dim Bin As String
    Dim A As String
     
    Do Until Int(Val) = 0
     
    If Val Mod 2 = 0 Then  ' est pair
     A = 0
     Bin = A & Bin
     Val = Val / 2
    Else ' est impair
    A = 1
    Bin = A & Bin
    Val = (Val - 1) / 2
    End If
     
    Loop
    DECBIN = Bin
    End Function
    '==== Conversion binaire en decimal
    Function BINDEC(ValBin As String)
    Dim n, i, p As Integer
    Dim Dec, A As Variant
     
    n = Len(ValBin)
    For i = 1 To n
     
        p = i - 1 ' p sert d'exposant et de décalage , la position des caractères va de 1 à n alors l'exposant va de 0 à n-1
        A = Mid(ValBin, n - p, 1)
        If A = 0 Then ' on fait rien
        Else
        Dec = Dec + (2 ^ p)
        End If
     
    Next i
    BINDEC = Dec
    End Function
    '======== conversion reel en binaire
    Function REEL(Valeur As Variant) '
    Dim c, m, E As Double
    Dim cpt As Integer
    Dim BinM, BinE As String
    Dim A, Signe As String
        '==test du signe
        If Valeur < 0 Then
            Signe = 1
        Else
            Signe = 0
        End If
    Valeur = Abs(Valeur)
    Do Until Int(Valeur) = 1 Or c = 23
    Valeur = Valeur / 2
    c = c + 1 ' compteur pour le petit e
    If Int(Valeur) = 1 Then
    m = Valeur - 1 ' récupération de la mantisse
    ElseIf c = 23 Then
    m = Valeur - Int(Valeur)
    Else
    End If
    Loop
    E = c + 127
    'MsgBox "Exposant = " & E & "  / Mantice = " & m
            ' ==conversion de la mantisse en binaire
    Do Until cpt = 23
    m = m * 2
        If Int(m) = 1 Then
        BinM = BinM & Int(m)
        m = m - Int(m)
        Else
    BinM = BinM & Int(m)
    End If
    cpt = cpt + 1
    Loop
    REEL = Signe & DECBIN(E) & BinM
    MsgBox REEL
    'Reel = CStr(Reel)
     
    Range("A1").Value = REEL
     
     
    End Function
    Sub test3()
     
    Dim WsDM As Worksheet
    Dim WsUnit As Worksheet
    Dim WsUBCD As Worksheet
    Dim WsREAL As Worksheet
    Dim ValConv As Double
    Dim Bin32 As String
    Dim A As Double
     
    Set WsREAL = ThisWorkbook.Worksheets(F_REAL)
    Set WsUnit = ThisWorkbook.Worksheets(F_UINT)
    A = WsREAL.Range("B3").Value
    'MsgBox a
    REEL (-97883571)
    End Sub

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    la précision numérique d'Excel étant limitée à 15 chiffres dixit site Microsoft comme l'aide d'Excel interne …

    Ensuite il est déconseillé de joindre un classeur comme stipulé dans l'en-tête des discussions de ce forum,
    comme beaucoup je n'ouvre pas de classeur comportant des macros.

    Un lien sur la norme ayant pu être utile aussi …

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 196
    Par défaut
    Merci pour les premiers éléments de réponse.

    J'ai supprimé la pièce jointe, c'est noté.

    le lien vers la norme : https://fr.wikipedia.org/wiki/IEEE_754

    Avec le fichier excel sans macro pour l'exemple.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/05/2021, 16h33
  2. Réponses: 0
    Dernier message: 12/12/2015, 20h00
  3. Conversion nombre décimal en virgule flottante IEEE 754 (exprimé en hexa)
    Par vinssieux dans le forum Macros et VBA Excel
    Réponses: 36
    Dernier message: 15/05/2008, 10h40
  4. nombre à virgule flottante
    Par new_wave dans le forum Langage
    Réponses: 1
    Dernier message: 14/01/2008, 12h16
  5. Réponses: 3
    Dernier message: 01/08/2007, 13h49

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