彻底搞懂float16与float32的计算方式
1 float 16与float 321.1 float161.1.1 计算方式float 16又称半精度, 用16个比特也就是2个字节表示一个数。如下图所示, 其中1位符号位, 5位指数位, 10位小数位。那么, 这16个比特位是怎么表示1个数的呢 ? 分3部分:符号位 , 指数部分, 小数部分。a 符号位: 1代表负数, 0代表正数。b 指数部分,5个比特位, 全0和全1有特殊用途,所以是00
1 float 16与float 32
1.1 float16
1.1.1 计算方式
float 16又称半精度, 用16个比特也就是2个字节表示一个数。
如下图所示, 其中1位符号位, 5位指数位, 10位小数位。
那么, 这16个比特位是怎么表示1个数的呢 ? 分3部分:符号位 , 指数部分, 小数部分。
a 符号位: 1代表负数, 0代表正数。
b 指数部分,5个比特位, 全0和全1有特殊用途,所以是00001~11110, 也就是1到30, 减去偏置15,指数部分最终范围为-14 ~15.
c 小数部分, 10个比特位, 范围为(0~1023)/1024.
所以最终一个数据的计算方式为:
( − 1 ) s i g n ∗ 2 e x p o n e n t − 15 ∗ ( 1 + f r a c t i o n 1024 ) (-1)^{sign}*2^{exponent-15}*(1+\frac{fraction}{1024}) (−1)sign∗2exponent−15∗(1+1024fraction)
但是需要注意, 有2个特殊情况, 也就是上面说的指数位全0和全1的特殊用途。
1)exponent全0
计算公式为
(
−
1
)
s
i
g
n
∗
2
−
14
∗
(
0
+
f
r
a
c
t
i
o
n
1024
)
(-1)^{sign}*2^{-14}*(0+\frac{fraction}{1024})
(−1)sign∗2−14∗(0+1024fraction)
2)exponent全1
如果fraction全0 , 则表示
+
i
n
f
+inf
+inf或者
−
i
n
f
-inf
−inf
如果fraction不全为0 , 则表示
N
a
N
NaN
NaN
1.1.2 表示范围与精度
根据上面的计算方法,
fp16 的最大值为:
0
11110
1111111111
=
2
15
∗
(
1
+
1023
/
1024
)
=
65504
0 \quad11110 \quad 1111111111=2^{15}*(1+1023/1024)=65504
0111101111111111=215∗(1+1023/1024)=65504
fp16 的最小值为:
1
11110
1111111111
=
−
1
∗
2
15
∗
(
1
+
1023
/
1024
)
=
−
65504
1 \quad11110 \quad 111111111 1=-1*2^{15}*(1+1023/1024)=-65504
1111101111111111=−1∗215∗(1+1023/1024)=−65504
精度为:
2
−
24
=
5.960464477539063
e
−
08
2^{-24}=5.960464477539063e-08
2−24=5.960464477539063e−08
有效动态范围: 5.960464477539063e-08 ~65504 \quad 注意这里不是从最小值到最大值, 而是说的正数的部分, 因为正负是对称的
另外, 需要注意的一点是, fp16表示的数的范围是非均匀的, 什么意思呢? fp16表示的数的范围是-65504- 65504, 但这些数并不是等间隔分布的。 在不同的区间, 间隔是不一样的, 最小的间隔为 2 − 24 2^{-24} 2−24, 最大的间隔为 2 5 2^5 25.
1.2 float32
1.2.1 计算方式
float32 又称单精度, 用32个比特数也就是4个字节表示一个数。
如下图所示, 其中1位符号位, 8位指数位, 23位小数位。
那么, 这32个比特位是怎么表示1个数的呢 ? 分3部分:符号位 , 指数部分, 小数部分。
a 符号位: 1代表负数, 0代表正数。
b 指数部分,8个比特位, 全0和全1有特殊用途,所以是00000001~11111110, 也就是1到254, 减去偏置127,指数部分最终范围为-126 ~127.
c 小数部分, 23个比特位, 范围为 ( 0 − − 2 23 − 1 ) / 2 23 (0 -- 2^{23}-1)/2^{23} (0−−223−1)/223
所以最终一个数据的计算方式为:
( − 1 ) s i g n ∗ 2 e x p o n e n t − 127 ∗ ( 1 + f r a c t i o n 2 23 ) (-1)^{sign}*2^{exponent-127}*(1+\frac{fraction}{2^{23}}) (−1)sign∗2exponent−127∗(1+223fraction)
但是需要注意, 有2个特殊情况, 也就是上面说的指数位全0和全1的特殊用途。
1)exponent全0
计算公式为
(
−
1
)
s
i
g
n
∗
2
−
126
∗
(
0
+
f
r
a
c
t
i
o
n
2
23
)
(-1)^{sign}*2^{-126}*(0+\frac{fraction}{2^{23}})
(−1)sign∗2−126∗(0+223fraction)
2)exponent全1
如果fraction全0 , 则表示
+
i
n
f
+inf
+inf或者
−
i
n
f
-inf
−inf
如果fraction不全为0 , 则表示
N
a
N
NaN
NaN
1.2.2 表示范围与精度
根据上面的计算方法,
fp32 的最大值为:
0
11111110
111111.....1111
=
2
127
∗
(
1
+
2
23
−
1
2
23
)
=
3.4028234663852886
e
+
38
0 \quad11111110 \quad 111111.....1111=2^{127}*(1+\frac{2^{23}-1}{2^{23}})=3.4028234663852886e+38
011111110111111.....1111=2127∗(1+223223−1)=3.4028234663852886e+38
fp32 的最小值为:
1
11111110
111111.....1111
=
−
1
∗
2
127
∗
(
1
+
2
23
−
1
2
23
)
=
−
3.4028234663852886
e
+
38
1 \quad11111110 \quad 111111.....1111=-1*2^{127}*(1+\frac{2^{23}-1}{2^{23}})=-3.4028234663852886e+38
111111110111111.....1111=−1∗2127∗(1+223223−1)=−3.4028234663852886e+38
精度为:
2
−
149
=
1.401298464324817
e
−
45
2^{-149}=1.401298464324817e-45
2−149=1.401298464324817e−45
有效动态范围:1.401298464324817e-45~3.4028234663852886e+38
\quad
注意这里不是从最小值到最大值, 而是说的正数的部分, 因为正负是对称的
同样地, fp32表示的数的范围是非均匀的. fp32表示的数的范围是-3.4028234663852886e+38 – 3.4028234663852886e+38, 但这些数并不是等间隔分布的。 在不同的区间, 间隔是不一样的, 最小的间隔为
2
−
149
2^{-149}
2−149, 最大的间隔为
2
104
2^{104}
2104.
更多推荐
所有评论(0)