You need four bytes to decompress, so add zero bytes if necessary:
z = x.decode('hex')
z = '\0' * (4 - len(z)) + z
It usually str.decodeoutputs as many bytes as necessary to represent the value, so you see that this only happens with small values.
This works great:
>>> z = '615885'.decode("hex")
>>> z = '\0' * (4 - len(z)) + z
>>> struct.unpack('!f', z)
(8.939797951825212e-39,)
, , 4 8.