Python numpy float16数据类型操作和float8吗?

发布于 2021-01-29 16:56:19

当对float16Numpy数字执行数学运算时,结果也是float16类型数字。我的问题是如何精确计算结果?说我乘/加两个float16数字,python是否会在float32中生成结果,然后将结果截断/舍入到float16?还是一直在“
16位多路复用器/加法器硬件”中执行计算?

另一个问题-是否有float8类型?我找不到这个……如果没有,那为什么呢?谢谢你们!

关注者
0
被浏览
142
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    对于第一个问题:float16典型处理器(至少在GPU外部)不支持硬件。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的相应代码。支撑npy_half_to_floatnpy_float_to_half功能在halffloat.c中定义,以及该float16类型的各种其他支撑功能。

    对于第二个问题:不,float8NumPy中没有类型。float16是一种标准类型(在IEEE
    754标准中进行了描述),在某些情况下(尤其是GPU)已经广泛使用。没有IEEE
    754float8类型,并且似乎没有明显的“标准”float8类型候选对象。我还猜想float8NumPy中对支持的需求并没有那么多。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看