C# 16 位浮点转换

标签 c# floating-point binary data-conversion 16-bit

我正在使用这里的 float 16 Half 类型 - https://gist.github.com/vermorel/1d5c0212752b3e611faf84771ad4ff0d

我定义了以下方法将半值转换为二进制字符串:

    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;
    }

以下方法将二进制字符串值转换为 Half:

    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 位二进制字符串表示形式转换为正确的半值 (1.571289)?

最佳答案

您的 HalfFromBinaryString 实现是错误的,因为您的代码实际上只是将字符串解释为二进制的 int ,并转换该 intHalf 并返回。您可以将返回行简化为 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');

关于C# 16 位浮点转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59728656/

相关文章:

java - 将 MP3 转换为二进制

c# - 如何从 webclient 获取状态码?

c - 我不确定为什么我的代码会产生这个算术错误?

c# - 在 C# 中将 Mac OS X 二进制格式的 plist 转换为可读格式

c - 我宣布 PI ,读取 alpha,但它没有进入指令。为什么它不打印0?

python - 在python中将 float 写入csv——截断错误

将二进制转换为对应的 ASCII 字符

c# - 如何为 WPF 中的字段制作自定义转换器?

c# - 使用 Microsoft Visual Web Developer 2010 Express 的 Web.Config 中无法识别的配置部分 httpHandlers

c# - MVVM 和控件的动态生成