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
		
		
        




   


  Répondre avec citation


 
Partager