gpt4 book ai didi

C# 16 位 float 转换

转载 作者:行者123 更新时间:2023-12-04 10:45:24 27 4
gpt4 key购买 nike

我从这里使用 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 struct 为您提供了 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 位 float 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59728656/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com