float16与float32计算方式
float,单精度浮点数,用32比特(bits)/4字节(bytes)表示。为方便区分16位和32位float格式,之后称单精度float为float32,半精度float为float16。float32的比特组成如图所示。
-
Sign:符号位,1bit,0代表正数,1代表负数。
-
Exponent:指 数位, 8bit,取值范围是00000001∼11111110(00000000和11111111有特殊用途),转换成十进制为1∼254,减去偏置值127得到最终范围是−126∼127。
-
Fraction:分数位,23bit,取值范围是0∼223。
除去指数位全0或全1的特殊情况,常规情况下float32数值计算公式为:
value=(−1)sign∗2exp−127∗(1+223frac)
特殊情况:
1.当exponent全是0时,float32数值计算公式为:
value=(−1)sign∗2−126∗(0+223frac)
2.当exponent全是1时,如果fraction全是0,value=inf;如果fraction全是1,value=NaN。
举例:以0 10000100 01001110000000000001110为例,sign=0,exponent=132,fraction=2555918,该二进制数字代表的数值为:
value=(−1)0∗2132−127∗(1+2232555918)=41.75005340576172
float32和float16表示数的范围都是非均匀的,指数位越大,对应的最小间隔就越大。float32的最小间隔与指数位的关系为:IntervalMin=2exp−127/223,最小间隔为2−149,最大间隔为2104。间隔变化图如下所示.
float16又称半精度浮点数,用16比特(bits)/2字节(bytes)表示。float16的比特组成如图所示。
Sign:符号位,1bit,0代表正数,1代表负数。
Exponent:指数位, 5bit,取值范围是00001∼11110(00000和11111有特殊用途),转换成十进制为1∼30,减去偏置值15 得到最终范围是−14∼15。
Fraction:分数位,10bit,取值范围是0∼210。
除去指数位全0或全1的特殊情况,常规情况下float32数值计算公式为:
value=(−1)sign∗2exp−15∗(1+210fraction)
特殊情况:
1.当exponent全是0时,float16数值计算公式为:
value=(−1)sign∗2−14∗(0+210fraction)
2.当exponent全是1时,如果fraction全是0,value=inf;如果fraction全是1,value=NaN
举例:以0 10010 0101100010为例,sign=0,exponent=18,fraction=354,
value=(−1)0∗218−15∗(1+210354)=10.765625
float16表示数的范围都是非均匀的,指数位越大,对应的最小间隔就越大,最小间隔与指数位的关系为:IntervalMin=2exp−15∗1/210 ,最小间隔为2−24,最大间隔为25。间隔变化图如下所示。
可参考IEEE 754浮点数