# IEEE 754 Conversion

Is there some source code for converting
numbers to IEEE 754 32 Bit Hex format?

• : Is there some source code for converting
: numbers to IEEE 754 32 Bit Hex format?
:

what you need is a union, but this code does it the hard way - enjoy!
Copy and paste into your app. The wrapped around lines should sort themselves out.

Function dword_to_float(ho As Long, lo As Long) As Single
'NOTE ho and lo are the 2 16 bit halves of the float
'held in longs so that be unsigned (range from 0 to 65535)
'IMPORTANT - YOU MUST! PUT a & on the end of each argument when you call this with an &H arg !!!!!!!!!!!!!!
'author: r@seabrooks.supanet.com -- bob.seabrook@dtrack.com UK -
'
'float format:
'bit0 sign
'next 8bits are exp+127
'rest is 23bit mantissa with assumed binary 1. in front (making 24bits)

'1 get exp
'2 sub 127
'3 get mantissa 23bits
'4 insert implied binary 1. at start giving 24bits
'5mult by 2^exp
'negate if sign bit set

Dim negative As Integer
Dim sign, hi_mantissa, lo_mantissa, exponent, result As Double
negative = ((ho And &HFFFF8000) <> 0) 'mask out exp and mantissa leaving only sign
exponent = ((ho And &H7F80) 128) - 127 'mask out sign, shr 7 places, sub 127 giving exp
If exponent > 127 Then exponent = 127
hi_mantissa = CDbl((ho And &H7F&) Or &H80&) / 128# 'mask out exp & sign, set implied msb of mantisa, scale to 1.xxxxxx binary
lo_mantissa = (CDbl(lo) / (128# * 65536#)) 'scale to 0.00000000xxxxxxxxxxxxxxxx
If negative Then sign = -1 Else sign = 1
'Debug.Print "hm"; hi_mantissa; "lm"; lo_mantissa;
result = sign * (hi_mantissa + lo_mantissa) * 2 ^ exponent
dword_to_float = CSng(result)
End Function
'
'float_to_dword f,h,l sets h & l to the 2 16bit halves of the 32bit float f
'where h is the high order half and l the low order half
'
Sub float_to_dword(ByVal f As Single, ho As Long, lo As Long)
'NOTE ho and lo hold the 2 16bit halves of the 32bit float
'they are longs so that they can be UNSIGNED. In other words they
'range from 0 to 65535
'author r@seabrooks.supanet.com -- bob.seabrook@dtrack.com UK -
'1 find sign
'2 find exp
'3 find mantissa
'4 ho msbit=sign
'5 ho next 8bits = exp
'6 ho next 7bits = high 7 bits of mantissa
'7 lo = low 16bits of mantissa
If f = 0 Then 'alas, 0 is a special case
ho = 0&
lo = 0&
Else
Dim sign As Long, exponent As Long, mantissa As Double, d As Double
'1 sign
If f < 0 Then
sign = &H8000&
d = -f
Else
sign = 0&
d = f
End If
'2 exp
'f is a mantissa in the range 1.0000000000 to 1.99999999999 x 2^(exponent_field-127)
'so keep dividing/multing float by 2 until in the range 1.0 to 1.999..
'while counting divs/mults. This count is the true exponent (pwr of 2)
'to which we add 127 giving the exponent_field
exponent = 127
If d >= 2 Then
While d >= 2# 'd was originally a copy of f
d = d / 2# 'd ends up as the 24bit mantissa
exponent = exponent + 1 'exponent ends up as the 8bit exponent
Wend
Else
While d < 1#
d = d * 2#
exponent = exponent - 1
Wend
End If
'3 24bit mantissa is in d, remove the msbit since it's always 1, giving a 23bit fractional mantissa field
d = d - 1# 'd is now 0 to .99999999 (meaning 1.0.. to 1.999..). The 1. is ASSUMED!
'4,5,6 ho = sign OR exp+127 OR high 7 bits of mantissa
ho = CLng(sign + (exponent * 128&) + Int(d * 128#))

'7 lo = low 16 bits of mantissa
lo = CLng(d * 8388608#) And &HFFFF& 'x 8388608 magnifies 23bit fractional mantissa into a 23bit long
End If

End Sub