机器学习-fp16表示

公式引入

存储方式:1位符号位+5位指数位+10位尾数位,共16位,内存占2个字节
sign:符号位
exponent:指数位(阶码)
fraction:小数位(尾数)
图1
fp16表示为:
图1

1.(1.0+fraction)中的1

规格化数(normal number):小数点前只有1位数,且非0
例:1.0 * 2^0, 0.1 * 2^1, 0.01 * 2^2都表示1,其中1.0 * 2^0被称为规格化值,后两者为非规格化值。
机器学习-fp16表示_第1张图片
对于二进制数,只存在0和1,所以规格化值小数点前的一位一定是1,则可以不用特地拿出1bit数去表示,在需要计算数值时,将这个1加上就行,这样在表示规格化值时,可以省出1Bit,使能表示的范围更大。所以小数部分中的前导1没有存储在内存中,但有效数字实际上是11位。

上述即为fp16的规格化数表达式

2. 2^(exponent-15)中的15

假设如果直接用2^exponent表示,其中5位的exponent用补码表示,则数字1/2和2的表示为:
1/2 : 0 11111 0000000000 (1/2 = 1.0 * 2^(-1), -1的补码为11111)
2:0 00001 0000000000 (2 = 1.0 * 2^1, 1的补码为00001)
在硬件实现浮点数比较运算时,如果复用整数的比较运算电路,这时就会得出1/2比2大的结果。

在这里插入图片描述
IEEE754标准使biased-exponent(基于偏移的阶码域)解决了这一问题,biased表示它采用偏移的编码方式。也就是5位的exponent没有符号位,而是通过设置一个中间值作为0,小于该中间值则为负数,大于改中间值则为正数。IEEE 754中规定bias = 2^(e-1) - 1,e为biased-exponent所占位数,所以fp16表示中,bias = 2^(5-1) - 1 = 15,小于15为负,大于15为正;
机器学习-fp16表示_第2张图片

相比最初的补码形式,引入指数偏移之后,实际表示的数据和原二进制一样开始按照升序表示。
1/2和2的IEEEE754表示为:
1/2 : 0 01110 0000000000 (1/2 = 1.0 * 2^(-1), -1=14 - bias)
2:0 10000 0000000000 (2 = 1.0 * 2^1, 1 = 16 - bias)
这时可以不对浮点做特殊处理,直接将16bit视作整数来比较大小。这就是为什么fp16的指数部分是2^(exponent-15)的原因。

3.fp16的规格化值

对于规格化值,exponent的取值范围为0 0001~ 1 1110,也就是1~30,Exponent = exponent-bias取值范围为-14 ~ 15,(0 0000和1 1111作为预留值来定义NaN,+/-Inf,+/-0,详细见后文)
fraction的取值范围为00 0000 0000 ~ 11 1111 1111,1+fraction取值范围为1 ~ 1.11 1111 1111

所以:
fp16规格化数能表示的趋于0的最小数为0 00001 0000 0000 00=1.0 * 2^(-14), 约等于6.1 * 10^(-5)
fp16规格化数能表示的最大值为:0 11110 1111 1111 11=1.11 1111 1111 * 2 ^ 15 = (2 - 2^(-10)) * 2 ^15=65536-32=65504
fp16规格化值的取值范围为:[-65504,-1.0 * 2^(-14) ]及[1.0 * 2^(-14), 65504]

4. fp16的非规格化数值

 规格化表示
由上面表达式可以知道,规格化数值能表示的最小的趋近于0 的数为1.0 * 2^(-14),也就是0~1.0 * 2^(-14)之间的数无法表示。IEEE754标准规定:当exponent取0 0000时的非0值,用denormalized number(非规格化数)表示,非规格数的作用就是用于表示非常趋近于0的数。当想表示的数值比 2 ^(-14)还要小时,这个数就会以非规格化表示,原本的M = 1+fraction,会变为M = fraction ,如下图。
在这里插入图片描述
机器学习-fp16表示_第3张图片

非规格化数可以表示的最大数为:0.11 1111 1111*2^(-14) = (1- 2 ^(-10))*2 ^(-14)=2 ^(-14) - 2 ^(-24)
非规格化数可以表示的最小的趋近于0的数为:0.00 0000 0001 * 2 ^(-14) =2 ^(-24)
非规格化数的取值范围:[-(2 ^(-14) - 2 ^(-24)), -2 ^(-24]及[2 ^(-24), 2 ^(-14) - 2 ^(-24)]

可能在想这里的指数为什么是1-bias而不是0-bias。在非规格化数值表示时,exponent明明是可以取到0的,这是为了提供数值从非规格化值到规格化值的平滑过度。这样就能和规格化数的取值范围[-65504,-1.0 * 2^(-14) ]及[1.0 * 2^(-14), 65504]合并为新的取值范围:
[-65504, -2 ^(-24)]及[2 ^(-24), 65504]

5. fp16的特殊值

  • IEEE754标准规定当exponent和fraction都为0时,fp16值为0
    此处和规格化值和非规格化值得取值范围[-65504, -2 ^(-24)]及[2 ^(-24), 65504]就能合并为fp16的完整范围:[-65505,65504]。

    机器学习-fp16表示_第4张图片
    所以在0除以某个数时会区分正负,其余情况对做+/-0不做区分.
    +0:0 00000 0000000000
    -0:1 00000 0000000000

  • 当exponent全为1时,表示非正常数(non-number):NAN和正负Inf
    NAN(比如a/0 、-1开根号、Inf-Inf、Inf*0):符号位任意,指数位全1,尾数位非全0
    Inf:符号位为0,指数位全1,位数位全0
    -Inf:符号位为1,指数位全1,尾数位全0

【补充】

  1. 当讨论fp16的取值范围时,实际讨论的是规格化数的范围,通过fp16的表达公式可知,增加fraction可以提高表示的精度,增加exponent可以提高表示的范围。计算机中存储位数是有限的,所以需要在表示范围和精度之间权衡,如果fraction过大,此时获得了较高的精度,但是可以表示的数值范围就有限。

  2. fp16的精度2^(-10)可以转换成对应十进制数的小数点后几位,计算如下:
    机器学习-fp16表示_第5张图片
    所以fp16可以精确到小数点后3位

6. fp16运算

  • 加、减:参考机器学习-fp16相加
  • 乘:参考机器学习-fp16相乘
  • 平方根
  • 求余
  • 比较

7. fp16转换

  • fp16转整形
  • 整形转fp16:参考机器学习-fp16转int8
  • fp16转成十进制数

你可能感兴趣的:(机器学习,C,机器学习,人工智能)