Convertisseur base 10 en base 2 VF 32 avec Visual basic

damdam37 Messages postés 4 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 25 avril 2010 - 25 avril 2010 à 01:48
damdam37 Messages postés 4 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 25 avril 2010 - 25 avril 2010 à 19:24
bonjour, je suis en train de vouloir faire un programme avec excel et visual basic qui me permettrai de convertir en base 2 vf32 une base 10
Je suis bloquer car j'arive a ecrire le signe, l'exposant mais pour la mantisse je bloque pouvez vous m'aider s'il vous plait.

j'ai rentrer sa dans Visual basic:

'recherche du signe
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Worksheets("feuil1").Range("B18") < 0 Then
Worksheets("feuil1").Range("C18").Value = 1
Else:
Worksheets("feuil1").Range("C18").Value = 0
End If
'premier PF
Worksheets("feuil1").Range("B19") = WorksheetFunction.Log(Sqr(Worksheets("feuil1").Range("B18") * (Worksheets("feuil1").Range("B18"))) / (WorksheetFunction.Log(2)))
'exposant
Worksheets("feuil1").Range("B20") = Fix(Worksheets("feuil1").Range("B19")) + 127
'deuxieme PF
Worksheets("feuil1").Range("B21") = WorksheetFunction.Log(Worksheets("feuil1").Range("B20")) / (WorksheetFunction.Log(2))
End Sub

pour la conversion de l'exposant en binaire j'ai mit = DecBin de la case ou l'exposant aparer.
pouvez vous m'eclairer sur la suite du programme pour la mantisse car je suis vraimen perdu et je me perd aussi sur tout les forum qui existe car j'y compren rien je suis honnete.
Merci d'avance
A voir également:

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 avril 2010 à 11:30
Salut
"convertir en base 2 vf32 une base 10" Kézako ?
C'est quoi "vf32" ?
Veux-tu convertir un chiffre décimal en binaire (1 ou 0) de 32 bits ?

Si ta valeur décimale se situe entre -512 et +511, tu peux directement utiliser la fonction DECBIN.
Sinon, mieux vaut passer par une itération des puissances de 2, classique.
Exemple :
Function ConvertDecToBin(DecVal As Currency) As String
    Dim r As Long
    Dim sValeur As String
    Dim sResult As String
    Dim HexVal As Variant
    HexVal = Array("0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", _
                   "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111")
    sValeur = Hex(DecVal)
    sValeur = Right$("00000000" & sValeur, 8)
    For r = 8 To 1 Step -1
        sResult = HexVal(Val("&h" & (Mid$(sValeur, r, 1)))) & sResult
    Next r
    ConvertDecToBin = Format(sResult, "0000 0000 0000 0000 0000 0000 0000 0000")
End Function

et pour l'appeler :
Range("C3").Value = ConvertDecToBin(Range("B3").Value)


Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
damdam37 Messages postés 4 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 25 avril 2010
25 avril 2010 à 12:10
oui je ve convertir un chiffre decimal en binaire de 32 bit qui comprend:
1 bit de signe
8 bit dexposant et 23 de mantisse
0
damdam37 Messages postés 4 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 25 avril 2010
25 avril 2010 à 12:21
j'ai rentrer ton programme sous visual basic mais sa marche pas comme je veu, car avec les chiffre du style 0,234 il ne fonctionne pas, il donne 0 partout alor que c pa le cas.
Je suis chian et je tien a mescuser mais j'aimerai y ariver en fait.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 avril 2010 à 18:43
Oui, en effet, je n'avais pas saisi qu'il s'agissait de vrai décimal.
C'est ce qui s'appelle un format 'little endian' (lecture de gauche à droite)
Pour faire ce que tu cherches à faire, il faut se renseigner sur le format de la donnée décimale et c'est coton. Voir <ce lien>
En plus, dans la conversion, il y a des cas particuliers (+0, -0, +Infini, -Infini et 1/3)

Je te colle un bout de code que j'avais commencé à travailler.
Vois si ça peut te servir (à coller dans un module, par exemple) :
Option Explicit

' IEEE 754 single precision binary floating-point format
' Définition des flottants 32 bits en simple précision :
'     0 01111100 01000100000001100000000
'     |  \____/   \___________________/
'   Sign Exponent      Significand
'   1 bit  8 bits        23 bits

' Lecture des bits de gauche à droite = format Little Endian

Public Type LARGE_INTEGER
    LowPart             As Long
    HighPart            As Long
End Type

Public Function LargeIntegerToDouble(Value As LARGE_INTEGER) As Double

    Dim sBits           As String
    Dim lSignBit        As Long     ' 1 bit
    Dim sExponent       As String   ' 8 bits
    Dim lExponent       As Long
    Dim sSignificand    As String   ' 23, puis 24 bits
    Dim dSignificand    As Double
    Dim dCoeff          As Double
    Dim r               As Long
    Dim sTemp           As String
        
    ' Cas particuliers
    sTemp = Right$("0000" & Hex(Value.HighPart), 4) & _
            Right$("0000" & Hex(Value.LowPart), 4)
    If sTemp = "00000000" Or _
       sTemp = "80000000" Then
        ' +0 et -0
        LargeIntegerToDouble = 0
    ElseIf sTemp = "7F800000" Then
        ' + Infini
        LargeIntegerToDouble = 3.402823E+38
    ElseIf sTemp = "FF800000" Then
        ' - Infini
        LargeIntegerToDouble = -1.401298E-45
    ElseIf sTemp = "3EAAAAAB" Then
        ' 1/3
        LargeIntegerToDouble = CDbl(1 / 3)
    Else
        ' Conversion du LongInteger en bits, plus facile à découper que Hexa
        sBits = LargeIntegerToBits(Value)
        ' Extraction des bits
        lSignBit = CLng(Mid$(sBits, 1, 1))
        sExponent = Mid$(sBits, 2, 8)
        sSignificand = "1" & Mid$(sBits, 10, 23)
        lExponent = BitsToLong(sExponent) - 127
        dCoeff = 1
        For r = 1 To 24
            If Mid$(sSignificand, r, 1) = "1" Then
                dSignificand = dSignificand + dCoeff
            End If
            dCoeff = dCoeff / 2
        Next r
        LargeIntegerToDouble = ((-1) ^ lSignBit) * (dSignificand * (2 ^ lExponent))
    End If

End Function

Private Function HexToBits(Value As String) As String

    Dim sTemp As String
    
    sTemp = Right$(String$(8, "0") & Value, 8)
    HexToBits = LongToBits(CLng("&h" & Left$(sTemp, 4))) + _
                LongToBits(CLng("&h" & Right$(sTemp, 4)))
    
End Function

Private Function LargeIntegerToBits(Value As LARGE_INTEGER) As String
    
    LargeIntegerToBits = LongToBits(Value.HighPart) & LongToBits(Value.LowPart)

End Function

Private Function LongToBits(Value As Long) As String
    ' Version 16 bits
    Dim r As Long
    Dim sTemp As String
    
    For r = 0 To 15
        If (Value And CLng(2 ^ r)) = CLng(2 ^ r) Then
            sTemp = "1" & sTemp
        Else
            sTemp = "0" & sTemp
        End If
    Next r
    LongToBits = sTemp
    
End Function

Private Function BitsToLargeInteger(Bits As String) As LARGE_INTEGER
    
    ' Renvoie une valeur 32 bits représentée par les Bits
    Dim sTemp As String
    
    sTemp = Right$(String$(32, "0") & Bits, 32)
    BitsToLargeInteger.HighPart = BitsToLong(Left$(sTemp, 16))
    BitsToLargeInteger.LowPart = BitsToLong(Right$(sTemp, 16))
    
End Function

Private Function BitsToLong(Value As String) As Long
    ' Version 16 bits
    Dim r As Long
    Dim ltemp As Long
    
    For r = 1 To Len(Value)
        ltemp = ltemp + (CLng(Mid$(Value, r, 1)) * (2 ^ (Len(Value) - r)))
    Next r
    BitsToLong = ltemp
    
End Function
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
damdam37 Messages postés 4 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 25 avril 2010
25 avril 2010 à 19:24
merci je vai voir avec se que tu ma donner c'est vraimen simpa de ta par
je voi qu'il y a des personne competente par ici, et a la rigueur dés que j'ai le programme fini je le mais sur le site
merci beaucoup en tous cas
0
Rejoignez-nous