Single in IEEE float umwandeln

wewa

Mitglied
Hallo!

Um mit einem Mikrocontroller kommunizieren zu können, muss ich eine VB Single-Zahl in das genormte 32-Bit float Format umwandeln.

Hier auf Wikipedia ist auch die Vorgehensweise beschrieben, ich habe auch schon versucht das in VB6 umzusetzen, aber leider funktioniert das irgendwie nicht.

Das ist die Funktion welche die Umsetzung erledigen soll.
Code:
Static Function Log2(x)
   Log2 = Log(x) / Log(2#)
End Function

Static Function SingleToFloat(x)
    Dim e As Integer
    Dim vz As Boolean
    Dim float, m As Long
    
    If x <> 0 Then
        e = Log2(Abs(x)) + 127 'Hier sollten nur die Vorkommastellen verwendet werden (nicht runden!) habe aber keinen Plan wie ich das anstellen soll
        m = (Abs(x) / (2 ^ e) - 1) * 2 ^ 23
        float = m
        float = float Or (e * &H800000)
        If x < 0 Then
            float = float Or &H80000000
        End If
    Else
        float = 0
    End If
    
    SingleToFloat = float
End Function

Es wäre toll wenn ihr mir ein wenig weiterhelfen könntet, Danke.
 
So einen Fehler habe ich schon entdeckt, der Exponent darf erst nach der Berechnung der Mantisse um 127 erhöht werden.

Die Funktion sieht nun so aus:

Code:
Static Function SingleToFloat(x)
    Dim e As Integer
    Dim vz As Boolean
    Dim float, m As Long
    
    If x <> 0 Then
        e = Log2(Abs(x)) 'Hier sollten nur die Vorkommastellen verwendet werden (nicht runden!) habe aber keinen Plan wie ich das anstellen soll
        m = (Abs(x) / (2 ^ e) - 1) * 2 ^ 23
        e=e+127
        float = m
        float = float Or (e * &H800000)
        If x < 0 Then
            float = float Or &H80000000
        End If
    Else
        float = 0
    End If
    
    SingleToFloat = float
End Function
Ich habe aber immer noch das Problem, dass ich nicht weiß, wie ich nur die Vorkommastellen einer Zahl verwende (nicht runden!, z.B. 11,67 -> 11).

//EDIT: Obige Berechnung stimmt nun (habe sie mit 11,25 - wie bei Wiki) überprüft. Nur das Problem mit den Vorkommastellen besteht noch immer.
 
Zuletzt bearbeitet:
Einfach aber wirksam, da hätte ich doch selbst draufkommen müssen.
Danke

Die fertige Single to IEEE Float Funktion sieht nun so aus:

Code:
Static Function SingleToFloat(X)
    Dim e As Integer
    Dim float, m As Long
    
    If X <> 0 Then
        e = Math.Round(Log2(Abs(X)) - 0.5)
        m = (Abs(X) / (2 ^ e) - 1) * 2 ^ 23
        e = e + 127
        float = m
        float = float Or (e * &H800000)
        If X < 0 Then
            float = float Or &H80000000
        End If
    Else
        float = 0
    End If
    
    SingleToFloat = float
End Function
 
Kleiner Hinweis:
Visual Basic:
Dim float, m As Long

Bei dieser Deklarierung ist "float" vom Typ Variant, und nur "m" ist vom Typ Long
 
Nur das Problem mit den Vorkommastellen besteht noch immer.


Wieso Rudungsgedöns verwenden?
Visual Basic:
Sub main()
Dim value As Single
Dim rounded As Integer
Dim truncated As Integer

    value = CSng(11.7)
    rounded = CInt(value)
    truncated = Int(value)
    Debug.Print value
    Debug.Print Format$(rounded)
    Debug.Print Format$(truncated)

End Sub
 
Zurück