数据精度
计算机如何表示和存储浮点数(小数)
在计算机的世界里是不存在小数点的概念的,所以压根没有地方存储小数点,只有0和1. 计算机是采用科学计数法(scientific notation)来存储浮点数.
其核心思想是将浮表达为移动的点.
计算公式:
其中:
s: sign表示符号位 - 正/负
M:Mantissa表示尾数位,即小数点后面的部分。标准采用的是implicit Normalization,规定小数点前默认有一个隐含的1
E: Exponent指数位
bias:
Example:
以下使用5.25为例拆解计算机是如何把这个小数存进电脑里的。过程如下:
step1:二进制化
整数 5 ---> 101
小数 0.25 ---> 0.01 (
组合一起表示为: 101.01
step2: 归一化,变为科学计数法
小数点向左移动2位,变为1.xxxxx的形式, 即,
step3: 填格子
符号位S: 正数 ---> 0
指数位E:
将129转为二进制:10000001
尾数位M:0101 需要在后面用0补充够23位 ---> 01010000000000000000000
计算机表示
以float32计算机中的表示为
| 符号位 | 指数位 | 位数位 |
|---|---|---|
| 0 | 10000001 | 01010000000000000000000 |
Float32 -> float16 -> bfloat16
| 精度 | 总位数 | 符号位 | 指数位 | 尾数位 |
|---|---|---|---|---|
| float32 | 32 bits | 1 | 8 | 23 |
| float16 | 16 bits | 1 | 5 | 10 |
| bfloat16 | 16 bits | 1 | 8 | 7 |
Float32
可表达最大数:
计算流程如下:
其中M为尾数位为23位,指数位为8位, 所以其表示范围为
偏移量bias为:
真实的指数位为:
尾数位一共23位, 可表达的最大值为23为均为1, 最小值为只有最后一位为1, 其他为0, 即
按照公式1,组后公式2,3,4后为:
精度
尾数位23位, 可表达精度为
Float16
可表达最大数:
计算流程如下:
其中M为尾数位为10位,指数位为5位, 所以其表示范围为
偏移量bias为:
真实的指数位为:
尾数位一共10位, 可表达的最大值为10为均为1, 最小值为只有最后一位为1, 其他为0, 即
按照公式1,组后公式2,3,4后为:
精度
尾数位10位, 可表达精度为
BFloat16
可表达最大数:
BFloat16保留了Float32的表达范围,但是牺牲了精度, 其精度只有Float16的一半,即2位小数。
总结
| 精度 | 总位数 | 符号位 | 指数位 | 尾数位 | 可表达最大数 | 小数有效位 |
|---|---|---|---|---|---|---|
| float32 | 32 bits | 1 | 8 | 23 | 6 | |
| float16 | 16 bits | 1 | 5 | 10 | 65504 | 3 |
| bfloat16 | 16 bits | 1 | 8 | 7 | 2 |