Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Conversion nombre à virgule flottante IEEE 754 en décimal

Nicko29

XLDnaute Nouveau
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 !

En pièce jointe le fichier sans macro

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
 

Pièces jointes

  • test.xlsx
    411.1 KB · Affichages: 63

Modeste geedee

XLDnaute Barbatruc
Bonsour® ces fonctions sont utilisables via en VBA... WorksheetFunction.Dec2Bin(arguments)
Dec2Bin
Hex2Bin
Bin2Hex
Dec2Hex
Hex2Dec
Bin2Dec

en tout état de cause EXCEL ne peut afficher plus de 15 chiffres significatifs
voir détails par type de données
voir également ce lien : http://fordom.free.fr/
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…