float
、double
和 long double
在<float.h> 中可用定义相等的定义。我知道有不同类型的半精度浮点数,但我只关心由IEEE 754标准规定的标准化的一种,称为
binary16
。从我的研究和测试中,我可以自信地将某些常量定义如下:
#define HALF_MANT_DIG 11
#define HALF_DIG 3
#define HALF_DECIMAL_DIG 5
#define HALF_EPSILON UINT16_C(0x1400) /* 0.00097656 */
#define HALF_MIN UINT16_C(0x0400) /* 0.00006103515625 */
#define HALF_MAX UINT16_C(0x7BFF) /* 65504.0 */
注意:epsilon,min和max是16位类型的原始十六进制表示。将原始值分配给类型的正确方法取决于所使用的半浮点库。
然而,对于指数相关的定义,我无法找到共识。我查看了二进制16的维基百科页面,这个其他SO问题,Half库以及GitHub和其他地方的一些其他代码。
来自上述SO问题的提案链接听起来很可信,以及Half库,好消息是它们匹配。然而,我在FP16.java实现,这个实现,Zig语言实现以及D语言的Sargon中发现了不同意见。
#define HALF_MIN_EXP The article and Half say (-13) but FP16.java and sargon say (-14)
#define HALF_MAX_EXP The article and Half say 16 but others say 14 or 15
#define HALF_MIN_10_EXP The article and Half say (-4) but sargon says (-5)
#define HALF_MAX_10_EXP The article and Half say 4 but sargon says 5
我认为这篇文章和Half很可能是正确的来源,但是,我能确定IEEE 754二进制16的好值吗?