Hola a todos! Después de algún tiempo, hoy me encuentro algo generoso, asi que quiero compartirlo con ustedes... Aquí van unas funciones para VB que nos permiten, una convertir un numero binario en formato float de Microchip a su equivalente real, y las otras dos la inversa. Son dos, una para calcular el exponente, y la otra para la mantisa. Espero les sirva...
Más información en la página de Microchip (Hace falta decirlo?
)
Ah!!! Gracias Jonathan por la respuesta en el foro de VB; si bien no era la solución a mi problema, sí me sirvió muy bien para encarar el problema y ya está solucionado. Muchas gracias!
'Funcion que convierte un numero en formato float a real
Public Function Hex_Float(Exp As Integer, Mantisa As Long) As Single
Dim Sign As Boolean
Dim Man_bin(23) As Byte
Dim i As Byte
Dim Res_float As Single
'determino exponente, en base a 0x7F
Exp = Exp - &H7F
'Extraigo signo
If Mantisa >= &H800000 Then
Sign = True
Else
Sign = False
End If
'Normalizo a 1.xxx
Mantisa = Mantisa Or &H800000
'Convierto a real
i = 23
Do
Man_bin(i) = Mantisa Mod 2
If Man_bin(i) = 1 Then
Res_float = Res_float + 2 ^ (-1 * i)
End If
Mantisa = Mantisa \ 2
i = i - 1
Loop While Mantisa > 1
Man_bin(i) = Mantisa
Res_float = Res_float + 2 ^ (-1 * i)
'Signo?
If Sign Then
Res_float = -1 * Res_float
End If
'Multiplico por el exponente
Res_float = Res_float * (2 ^ Exp)
Hex_Float = Res_float
End Function
'Funcion que devuelve la mantisa de un numero real
Public Function Float_Mantisa(Num As Single) As Long
Dim Exp As Integer
Dim Normalize As Single
Dim Bin(23) As Byte
Dim i As Byte
Dim aux As Long
'Obtengo el exponente
Exp = Float_Exp(Num)
Exp = Exp - &H7F
'Normalizo
Normalize = Abs(Num) / (2 ^ Exp)
'Convierto en array binario (24bits)
For i = 0 To 23
If Normalize >= 2 ^ (-1 * i) Then
Bin(i) = 1
Else
Bin(i) = 0
End If
Normalize = Normalize - (Bin(i) * 2 ^ (-1 * i))
Next
'Convierto array binario en valor de la mantisa
aux = 0
Bin(0) = 0
For i = 0 To 23
aux = aux + Bin(23 - i) * 2 ^ i
Next
'Determino el signo
If Num < 0 Then
aux = aux Or &H800000
End If
Float_Mantisa = aux
End Function
'Funcion que determina el exponente de un numero real
Public Function Float_Exp(Num As Single) As Byte
Float_Exp = Int(Log(Abs(Num)) / Log(2)) + &H7F
End Function