# Two byte floating point number.

You my also have to change the byte order.

Try this

``````Function Float32ToFloat16(d as single) As Int16
dim mb1 as new MemoryBlock(4)
dim mb2 as new MemoryBlock(2)
dim result as Int16
mb1.LittleEndian= false
mb2.LittleEndian= false

mb1.SingleValue(0)= d

// sign bit
mb2.byte(0) = mb1.byte(0) AND &h80

// exponent
dim exp as integer
exp = mb1.Int16Value(0) AND &h7f80     // bits 2-9 of 16
exp = bitwise.ShiftRight(exp, 7)
if exp<> 0 then
exp= exp - 127  // bias for single
exp = exp mod 16
exp= exp + 7   //bias for half
exp = bitwise.ShiftLeft(exp, 3)   // bits 2-5 of 8
mb2.byte(0) = mb2.byte(0) OR exp
end

// mantissa
dim man as integer
man = mb1.Int32Value(0) AND &h7FFFFF
man = ShiftRight(man, 12)    // only need first 10 bits
mb2.Int16Value(0) = mb2.Int16Value(0) OR man

result = mb2.Int16Value(0)
return result

End Function``````

Nope… not right.

Yeah, I can’t make out the format. I even moved the sign bit so it’s 4-1-11 like in your original post, but I don’t get the right values. Sorry.

Of course, the values you provided are suspect. Shouldn’t there only be one representation of each number?

No it depends on how you calculate the exponent and the mantissa. (as you see on 1 and 100)
The result the other way should alway match.
Thats whay a function that calculate the real value would make things easier to check Apriciate it !

The sign is bit 11 not 15
The exponent is bit 12 to 15

E3 E2 E1 E0 S M10 M9 M8 M7 M6 M5 M4 M3 M2 M1 M0

OK. I figured out the rules. The exponent has no bias - it cannot be negative. And the mantissa includes an explicit leading 1 bit, whereas a Single has an implicit 1 bit. So here are 2 methods:

``````Function Float32ToFloat16(d as single) As Int16
dim mb1 as new MemoryBlock(4)
dim mb2 as new MemoryBlock(2)
dim result as Int16
mb1.LittleEndian= false
mb2.LittleEndian= false

mb1.SingleValue(0)= d

// sign bit
mb2.byte(0) = mb1.byte(0) AND &h80
mb2.byte(0) = bitwise.ShiftRight(mb2.byte(0), 4)

// exponent
dim exp as integer
exp = mb1.Int16Value(0) AND &h7f80     // bits 2-9 of 16
exp = bitwise.ShiftRight(exp, 7)

// mantissa
dim man as integer
man = mb1.Int32Value(0) AND &h7FFFFF
man = ShiftRight(man, 13)    // only need first 10 bits

if exp<> 0 then
exp= exp - 127  // bias for single
if exp>= 0 then exp= exp+ 1   // add back the implicit 1 bit
man= man OR &h400   // add back implicit 1
end

if exp< 0 then
man = ShiftRight(man, abs(exp+1))
exp= 0
end

exp = exp mod 16
exp = bitwise.ShiftLeft(exp, 4)   // bits 1-4 of 8
mb2.byte(0) = mb2.byte(0) OR exp

mb2.Int16Value(0) = mb2.Int16Value(0) OR man

result = mb2.Int16Value(0)
return result

End Function``````
``````Function Float16ToFloat32(n as int16) As single
dim mb1 as new MemoryBlock(4)
dim mb2 as new MemoryBlock(2)
dim result as Single
mb1.LittleEndian= false
mb2.LittleEndian= false

mb2.Int16Value(0) = n

// sign bit
mb1.byte(0) = mb2.byte(0) AND &h08
mb1.byte(0) = Bitwise.ShiftLeft(mb1.byte(0), 4)

// exponent
dim exp as integer
exp = mb2.byte(0) AND &hF0
exp = bitwise.ShiftRight(exp, 4)

// mantissa
dim man as integer
man = mb2.Int16Value(0) AND &h7FF

if exp= 0 and man<> 0 then
// number between 0 and 1
dim x as integer
for i as integer = 10 downto 0
x= 2^i
x= man AND x
if x = 0 then
exp = exp -1
else
exit for
end
next
exp= exp- 1
man = man AND &h3FF
man = bitwise.ShiftLeft(man, abs(exp+1))
end

if exp<> 0 then
if exp> 0 then exp = exp - 1     // skip explicit 1 bit
exp = exp + 127  // bias for single
exp = bitwise.ShiftLeft(exp, 7)   // bits 2-9 of 16
mb1.Int16Value(0) = mb1.Int16Value(0) OR exp
end

man= man AND &h3FF    // strip explicit 1
man = Bitwise.ShiftLeft(man, 13)
mb1.Int32Value(0) = mb1.Int32Value(0) OR man

result = mb1.SingleValue(0)
return result

End Function``````

Great work Tim!!
Thanks!

It was an interesting puzzle. Some people do crosswords. I twiddle bits. LOL…

Let me know if you run out of puzzles.
CRC algorithms I can’t figure out…