C# 16 битные преобразования с плавающей запятой - PullRequest
1 голос
/ 14 января 2020

Здесь я использую тип поплавка 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)?

1 Ответ

1 голос
/ 14 января 2020

Ваша реализация HalfFromBinaryString неверна, потому что ваш код на самом деле просто интерпретирует строку как int в двоичном виде и приводит ее int к Half и возвращает. Вы можете упростить обратную строку до return (Half)intValue;, и она все равно будет делать то же самое.

Поскольку структура Half предоставляет вам метод ToHalf(ushort), вы можете использовать его для создания Half , По сути, проанализируйте строку как ushort и передайте ushort в ToHalf:

ushort bits = Convert.ToUInt16(bstra, 2);
return Half.ToHalf(bits);

Ваш HalfToBinaryString метод также может быть упрощен, так как Half также обеспечивает обратную операцию из ToHalf - GetBits:

ushort bits = Half.GetBits(value);
return Convert.ToString(bits, 2).PadLeft(16, '0');
...