彻底搞懂float16与float32的计算方式
彻底搞懂float16与float32的计算方式
在计算机科学中,浮点数是表示实数的一种方法,而float16和float32是两种常用的浮点数格式。本文将详细介绍这两种格式的计算方式、表示范围和精度,帮助读者深入理解它们的原理和差异。
1. float16与float32
1.1 float16
1.1.1 计算方式
float16又称半精度,用16个比特(2个字节)表示一个数。如下图所示,其中1位符号位,5位指数位,10位小数位。
那么,这16个比特位是怎么表示1个数的呢?分3部分:符号位,指数部分,小数部分。
- 符号位:1代表负数,0代表正数。
- 指数部分,5个比特位,全0和全1有特殊用途,所以是00001
11110,也就是1到30,减去偏置15,指数部分最终范围为-1415。 - 小数部分,10个比特位,范围为(0~1023)/1024。
所以最终一个数据的计算方式为:
(-1)^{sign} * 2^{exponent-15} * (1 + \frac{fraction}{1024})
但是需要注意,有2个特殊情况,也就是上面说的指数位全0和全1的特殊用途。
1)exponent全0
计算公式为
(-1)^{sign} * 2^{-14} * (0 + \frac{fraction}{1024})
2)exponent全1
如果fraction全0,则表示+inf或者-inf
如果fraction不全为0,则表示NaN
1.1.2 表示范围与精度
根据上面的计算方法,
fp16的最大值为:0 11110 1111111111 = 2^{15} * (1 + 1023/1024) = 65504
fp16的最小值为:1 11110 1111111111 = -1 * 2^{15} * (1 + 1023/1024) = -65504
精度为:2^{-24} = 5.960464477539063e-08
有效动态范围:5.960464477539063e-08~65504
注意这里不是从最小值到最大值,而是说的正数的部分,因为正负是对称的
另外,需要注意的一点是,fp16表示的数的范围是非均匀的,什么意思呢?fp16表示的数的范围是-65504~65504,但这些数并不是等间隔分布的。在不同的区间,间隔是不一样的,最小的间隔为2^{-24},最大的间隔为2^5。
1.2 float32
1.2.1 计算方式
float32又称单精度,用32个比特数(4个字节)表示一个数。如下图所示,其中1位符号位,8位指数位,23位小数位。
那么,这32个比特位是怎么表示1个数的呢?分3部分:符号位,指数部分,小数部分。
- 符号位:1代表负数,0代表正数。
- 指数部分,8个比特位,全0和全1有特殊用途,所以是00000001
11111110,也就是1到254,减去偏置127,指数部分最终范围为-126127。 - 小数部分,23个比特位,范围为(0--2^{23}-1)/2^{23}
所以最终一个数据的计算方式为:
(-1)^{sign} * 2^{exponent-127} * (1 + \frac{fraction}{2^{23}})
但是需要注意,有2个特殊情况,也就是上面说的指数位全0和全1的特殊用途。
1)exponent全0
计算公式为
(-1)^{sign} * 2^{-126} * (0 + \frac{fraction}{2^{23}})
2)exponent全1
如果fraction全0,则表示+inf或者-inf
如果fraction不全为0,则表示NaN
1.2.2 表示范围与精度
根据上面的计算方法,
fp32的最大值为:0 11111110 111111.....1111 = 2^{127} * (1 + \frac{2^{23}-1}{2^{23}}) = 3.4028234663852886e+38
fp32的最小值为:1 11111110 111111.....1111 = -1 * 2^{127} * (1 + \frac{2^{23}-1}{2^{23}}) = -3.4028234663852886e+38
精度为:2^{-149} = 1.401298464324817e-45
有效动态范围:1.401298464324817e-45~3.4028234663852886e+38
注意这里不是从最小值到最大值,而是说的正数的部分,因为正负是对称的
同样地,fp32表示的数的范围是非均匀的。fp32表示的数的范围是-3.4028234663852886e+38~3.4028234663852886e+38,但这些数并不是等间隔分布的。在不同的区间,间隔是不一样的,最小的间隔为2^{-149},最大的间隔为2^{104}。