Здесь я использую тип поплавка 16 Half - https://gist.github.com/vermorel/1d5c0212752b3e611faf84771ad4ff0d
Я определил следующий метод для преобразования значения Half в двоичную строку:
static string HalfToBinaryString(Half value)
{
int bitCount = Marshal.SizeOf(value) * 8;
string s = String.Empty;
// value is the value you want to convert to a string (double, long, int, ...)
foreach (byte b in Half.GetBytes(value))
{
s += Convert.ToString(b, 2).PadLeft(8, '0'); // for hex. For binary, use 2 and 8. For octal, use 8 and 3
}
return s;
}
И следующий метод преобразования двоичного строкового значения в половину:
static Half HalfFromBinaryString(string bstra)
{
int intValue = Convert.ToInt16(bstra, 2);
return (Half)BitConverter.ToInt16(Half.GetBytes(intValue), 0);
}
Когда я выполняю следующее деление, я получаю:
string dividend = "11001001001111111";
Half result = (Half)(Convert.ToSingle(Convert.ToInt32(dividend, 2)) / 65536.0);
var rawbits = HalfToBinaryString(result);
//result = 1.571289
//rawbits = "0100100100111110"
Однако, когда я выполняю обратное операция, я получаю:
Half halfval = HalfFromBinaryString(rawbits);
//halfval = 29840 //(instead of 1.571289)
Как преобразовать 16-разрядное двоичное строковое представление в правильное значение Half (1.571289)?