Skip to content

数据精度

计算机如何表示和存储浮点数(小数)

在计算机的世界里是不存在小数点的概念的,所以压根没有地方存储小数点,只有01. 计算机是采用科学计数法(scientific notation)来存储浮点数.

其核心思想是将表达为移动的点.

计算公式:

(1)s×1.M×2Ebias

其中:

s: sign表示符号位 - 正/负

M:Mantissa表示尾数位,即小数点后面的部分。标准采用的是implicit Normalization,规定小数点前默认有一个隐含的1

E: Exponent指数位

bias:

bias=2k11

Example:

以下使用5.25为例拆解计算机是如何把这个小数存进电脑里的。过程如下:

step1:二进制化

整数 5 ---> 101

小数 0.25 ---> 0.01 (22=14)

组合一起表示为: 101.01

step2: 归一化,变为科学计数法

小数点向左移动2位,变为1.xxxxx的形式, 即,

1.0101×22

step3: 填格子

符号位S: 正数 ---> 0

指数位E:

2+bias=2+(2811)=129

将129转为二进制:10000001

尾数位M:0101 需要在后面用0补充够23位 ---> 01010000000000000000000

计算机表示

以float32计算机中的表示为

符号位指数位位数位
01000000101010000000000000000000

Float32 -> float16 -> bfloat16

精度总位数符号位指数位尾数位
float3232 bits1823
float1616 bits1510
bfloat1616 bits187

Float32

可表达最大数:

(2223)×2127=3.4028235×1038

计算流程如下:

(1)1.M×2Ebias

其中M为尾数位为23位,指数位为8位, 所以其表示范围为 [0,281] 共256个数, 其中0和255表示特殊值. 0表示0, 255表示无穷大或NaN. 其他数表示正常的浮点数, 共254个, 即Etotal=254

偏移量bias为:

(2)bias=2811=127

真实的指数位为:

(3)Ereal=Etotalbias=254127=127

尾数位一共23位, 可表达的最大值为23为均为1, 最小值为只有最后一位为1, 其他为0, 即 1.M

(4)1.M=1+(1223)=(2223)

按照公式1,组后公式2,3,4后为:

(2223)×2127=3.4028235×1038

精度

尾数位23位, 可表达精度为 223 约6位小数

223=>log10(223)=23×log10(2)=6.97

Float16

可表达最大数:

(2210)×215=65504

计算流程如下:

(1)1.M×2Ebias

其中M为尾数位为10位,指数位为5位, 所以其表示范围为 [0,251] 共32个数, 其中0和31表示特殊值. 0表示0, 31表示无穷大或NaN. 其他数表示正常的浮点数, 共30个, 即Etotal=30

偏移量bias为:

(2)bias=2511=15

真实的指数位为:

(3)Ereal=Etotalbias=3015=15

尾数位一共10位, 可表达的最大值为10为均为1, 最小值为只有最后一位为1, 其他为0, 即 1.M

(4)1.M=1+(1210)=(2210)

按照公式1,组后公式2,3,4后为:

(2210)×215=65504

精度

尾数位10位, 可表达精度为 210 约3位小数

210=>log10(210)=10×log10(2)=3.32

BFloat16

可表达最大数:

1038

BFloat16保留了Float32的表达范围,但是牺牲了精度, 其精度只有Float16的一半,即2位小数。

总结

精度总位数符号位指数位尾数位可表达最大数小数有效位
float3232 bits18233.402×10386
float1616 bits1510655043
bfloat1616 bits18710382

Reggie | MIT Licensed