# Single in IEEE float umwandeln



## wewa (10. September 2008)

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.

```
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.


----------



## wewa (10. September 2008)

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:


```
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.


----------



## NeMeSiS1987 (10. September 2008)

Einfach so:


```
Math.Round(x - 0.5)
```

Grüße
NeMeSiS


----------



## wewa (10. September 2008)

Einfach aber wirksam, da hätte ich doch selbst draufkommen müssen.
Danke

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


```
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
```


----------



## Zvoni (10. September 2008)

Kleiner Hinweis:

```
Dim float, m As Long
```

Bei dieser Deklarierung ist "float" vom Typ Variant, und nur "m" ist vom Typ Long


----------



## Zvoni (10. September 2008)

wewa hat gesagt.:


> Nur das Problem mit den Vorkommastellen besteht noch immer.




Wieso Rudungsgedöns verwenden?

```
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
```


----------



## DrSoong (10. September 2008)

wewa hat gesagt.:


> 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).





NeMeSiS1987 hat gesagt.:


> Math.Round(x - 0.5)



Häh? Denk ich jetzt mit meinem


```
x = Int(y)
```

zu kompliziert?


Der Doc!


----------



## Zvoni (10. September 2008)

DrSoong hat gesagt.:


> Häh? Denk ich jetzt mit meinem
> 
> ```
> x = Int(y)
> ...



Nääh, du denkst wie ein Österreicher ^^
Past scho!


----------

