C# 16 位浮点数转换
C# 16 bit float conversions
我正在使用此处的 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
,然后将 int
转换为 Half
和 returning。您可以将 return 行简化为 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');
我正在使用此处的 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
,然后将 int
转换为 Half
和 returning。您可以将 return 行简化为 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');