在对float16 numpy编号执行数学运算时,结果也是float16 type编号。
我的问题是如何精确计算结果?
假设我将两个float16数字相乘/相加,python是否在float32中生成结果,然后将结果截断/舍入到float16?或者计算是在“16位多路复用器/加法器硬件”中进行的?
另一个问题-是否有float8类型?我找不到这个…如果不是,那为什么?谢谢大家!

最佳答案

对于第一个问题:在典型的处理器上(至少在GPU之外),没有对float16的硬件支持。numpy完全按照您的建议执行:将float16操作数转换为float32,对float32值执行标量操作,然后将float32结果舍入为float16。可以证明,结果仍然是正确的四舍五入:对于四个基本算术运算和平方根而言,float32的精度足够大(相对于float16的精度),这里不存在二舍五入的问题。
在当前的numpy源代码中,这是四个基本算术运算的定义对于float16标量运算的样子。

#define half_ctype_add(a, b, outp) *(outp) = \
        npy_float_to_half(npy_half_to_float(a) + npy_half_to_float(b))
#define half_ctype_subtract(a, b, outp) *(outp) = \
        npy_float_to_half(npy_half_to_float(a) - npy_half_to_float(b))
#define half_ctype_multiply(a, b, outp) *(outp) = \
        npy_float_to_half(npy_half_to_float(a) * npy_half_to_float(b))
#define half_ctype_divide(a, b, outp) *(outp) = \
        npy_float_to_half(npy_half_to_float(a) / npy_half_to_float(b))

以上代码取自numpy源代码中的scalarmath.c.src。您还可以查看loops.c.src了解数组ufuncs的相应代码。在halffloat.c中定义了支持的npy_half_to_floatnpy_float_to_half函数,以及用于float16类型的各种其他支持函数。
对于第二个问题:不,numpy中没有float8类型。float16是一种标准化类型(在IEEE754标准中描述),在某些情况下(尤其是GPU)已经被广泛使用。没有ieee 754float8类型,也没有明显的“标准”float8类型的候选者。我还想,对numpy中的float8支持没有太大的需求。

10-02 21:33