在对 float16 Numpy 数字进行数学运算时,结果也是 float16 类型的数字。 我的问题是结果是如何计算出来的? 假设我将两个 float16 数字相乘/相加,python 是否在 float32 中生成结果,然后将结果截断/舍入为 float16?还是一直在'16bit multiplexer/adder hardware'中进行计算?
另一个问题 - 有 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))
以上代码摘自scalarmath.c.src在 NumPy 源代码中。你也可以看看loops.c.src对于数组 ufunc 的相应代码。支持的 npy_half_to_float
和 npy_float_to_half
函数在 halffloat.c 中定义。 ,以及 float16
类型的各种其他支持函数。
对于第二个问题:不,NumPy 中没有float8
类型。 float16
是一种标准化类型(在 IEEE 754 标准中进行了描述),已经在某些环境(尤其是 GPU)中广泛使用。没有 IEEE 754 float8
类型,似乎也没有明显的“标准”float8
类型候选者。我还猜测 NumPy 中对 float8
支持的需求并不多。
关于Python numpy float16 数据类型操作,和 float8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38975770/