.NET 5开始支持半精度浮点数Half类型

微软在.NET 5的第7预览版中加入了一个称为Half的类型,相当于半精度浮点数binary16,也就是使用16位元存储浮点数值。IEEE 754规范定义了各种浮点数类型,包括binary16、binary32、binary64和binary128,微软提到,C#中相当于binary32的Float,以及binary64的Double,这两个是大部分开发人员熟悉的类型,这些标准格式可以让开发者在应用程序中,选择适当的类型表达一定范围的精度数值。

而在最新版本的.NET 5中,官方增加了一个全新的Half类型,是占16位元的二进制浮点数,由于Half只有Float一半的位元,因此Half可以表示的数值范围则在正负65504之间,Half被定义为以2为基数的16位元交换格式,目的是要支持浮点资料的交换,微软提到,Half类型的主要使用案例,像是存储不需要全精度的计算结果等,而目前已经有许多工作负载使用到Half类型,诸如机器学习、绘图卡、新的处理器和原生SIMD函数库等。

由于Half只有16位元,因此任何的半精度浮点数值,都可以表示为浮点数或是双精度浮点数,而不会损失精准度,但是反向操作,从浮点数或是双精度浮点数转为半精度浮点数时,则会失去部分精准度。微软表示,在.NET 5.0中,Half类型为一个没有算数运算符定义的交换类型,其只支持解析、格式化和比较运算符,但因为所有算术运算都需要明确转换为浮点数或是双精度浮点数,微软提到,在未来的版本将会考虑直接在Half添加算数运算符。

由于.NET开始支持Half类型,填补了.NET生态系统中的类型空白,许多数值函数库可能会开始支持Half类型,而机器学习开发组件ML.NET,也有望开始使用Half,并且从中获得计算上的好处。

发表评论