文章目录
浮点数计算不太好理解。
浮点数的结构
浮点数的结构分为3部分:
符号位 # 符号位可不是小数点位,别弄混了
指数位
尾数位
| 类型 | 符号位 | 指数位 | 尾数位 |
|---|---|---|---|
| 16位浮点数 | 1位 | 5位 | 10位 |
| 32位浮点数 | 1位 | 8位 | 23位 |
| 十进制 | 二进制 | 符号位 | 指数位 | 尾数位 |
|---|---|---|---|---|
| 0.625 | 0.5+0.125=2-1+2-3=1.01x2-1 | 0 | -1 | 1.01 |
2的次方对照表
这里只展示25到2-10次方:
| 二进制 | 25 | 24 | 23 | 22 | 21 | 20 | 2-1 | 2-2 | 2-3 | 2-4 | 2-5 | 2-6 | 2-7 | 2-8 | 2-9 | 2-10 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 十进制 | 32 | 16 | 8 | 4 | 2 | 1 | 0.5 | 0.25 | 0.125 | 0.0625 | 0.03125 | 0.015625 | 0.0078125 | 0.00390625 | 0.001953125 | 0.0009765625 |
偏移量
负数在计算时太麻烦,所以存的时候加个偏移量,都存为正数,解的时候再减掉。
fp16 偏移量为15
fp32 偏移量为127
为什么是这个值呢?
以fp32为例,8位指数位的范围是-126到127,0和128被保留了,表示0和无穷大。
所以即使是最小值-126,加上127也是正数,符合设计理念。
同理fp16,5位指数位的范围-14到15,0和16被保留了。
最小值-14,加上15也是正数,也符合设计理念。
所以存储值的指数位的值是 (-14+15,15+15)= (1,30)
当反算值的时候,减去15,30-15=15,最大值的情况是215
浮点数计算公式
这块不太好理解,有时间再看看。
IEEE 754 标准下,浮点数的通用计算公式其实就是一个"二进制版的科学计数法"。
对于最常见的 规格化数,公式如下:

符号说明:
| 符号 | 含义 | 说明 |
|---|---|---|
| S | 符号位 | 0 代表正数,1 代表负数。 |
| M | 尾数 | 存储的是小数部分。注意公式里是 1.M ,这意味着二进制小数点前默认隐藏了一个 1(这叫隐含位)。 |
| E | 指数存储值 | 指数位里实际存的二进制数(无符号整数)。 |
| \text{Bias} | 偏移量 | 用来把存储的指数 E 还原成真实指数的常数。 |
