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

标签 python numpy floating-point precision

在对 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_floatnpy_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/

相关文章:

python - Pandas 子集基于多列的两个数据框

python - TypeError : The value of a feed cannot be a tf. Tensor对象传递一个热编码时

python - 计算 numpy 矩阵中 true 的周围(python)

python - 如何在 Pandas 中为字符串添加前导零格式?

compression - 为什么我可以将 "fold"范围内的整数变成二分之一大小而不丢失信息?

float 相等和不等

c - 通过基数和指数显式定义浮点值

Python:删除 2 个 csv 文件中的重复元组

python - "NameError: global name is not defined"当 PDB 认为已定义时抛出

python - 如果数据框中的列有多个值,则创建多行