IEEE 754¶
IEEE 754 是国际上通用的 浮点数表示标准,定义了计算机中如何表示和运算带小数的实数。它被广泛用于 CPU、GPU、FPGA 等各种芯片中。
WiKipedia: IEEE 754
IEEE 754 是计算机里“实数”的通用表示法,让浮点数可以被可靠、高效、跨平台地处理。
工具¶
可视化浮点工具
📦 IEEE 754 定义的内容包括:¶
✅ 1. 浮点数格式¶
常见有几种格式(以二进制为主):
名称 |
总位数 |
指数位 |
尾数位 |
精度 |
---|---|---|---|---|
Half |
16 |
5 |
10 |
~3 位小数 |
Single |
32 |
8 |
23 |
~7 位小数 |
Double |
64 |
11 |
52 |
~15 位小数 |
FP8(扩展) |
8 |
4/5 |
3/2 |
低精度,用于 AI |
✅ 2. 浮点数结构(三部分)¶
浮点数由三部分组成:
[ 符号位 ][ 指数(加了 bias) ][ 尾数(有效数字) ]
非 subnormal 公式
值 = (−1)^sign × (1 + fraction) × 2^(exponent - bias)
sign
:0 表示正,1 表示负exponent
:偏移编码的指数(存的时候加了 bias)fraction
:尾数的小数部分(没有包括前导 1,默认是 1.xxx,非subnormal则是0.xxx)bias
:2^(exponent长度-1)-1示例
0 00001 0000000010
参数:
sign = 0
16位半精度的exponent长度: 5
bais: 2^(exponent长度-1)-1 = 2^4-1=15
exponent = 00001 = 1
fraction = 0000000010 = 0.0000000010
计算过程
= (−1)^sign × (1 + fraction) × 2^(exponent - bias)
= (-1)^0 × (1 + 0.0000000010) × 2^(1 - 15)
= 2^(-14)× 1.0000000010
≈ 6.1*10^(−5)
✅ 3. 特殊值支持¶
subnormal的公式
值 = (−1)^sign × (0 + fraction) × 2^(1 − bias)
IEEE 754 支持一些特殊情况:
±0
:所有位为 0±∞
:指数全 1,尾数为 0NaN
(不是一个数):指数全 1,尾数非 0次正规数(subnormal):指数为全 0,尾数非 0,用于表示极小的非零数
次正规数(subnormal)
是指那些 非常接近于 0 的正数或负数,它们太小了,小到 已经无法用标准的规格化浮点表示法来表达。
只能表示很小很小的数,但不能表示 0
示例:
0 00000 0000000001 = 2^(-10)*2^(1-15) ≈ 5.96*10^−8
参数
16位半精度的exponent长度: 5
bais: 2^(exponent长度-1)-1 = 2^4-1=15
fraction = 0.0000000001
sign: 0
计算过程:
= (−1)^sign × (0 + fraction) × 2^(1 − bias)
= (−1)^0 × (0 + 0.0000000001) × 2^(1 − 15)
= 2^(-10)*2^(1-15)
≈ 5.96*10^(−8)
📚 衍生标准(对深度学习重要)¶
格式 |
来自 IEEE754 吗 |
用途 |
---|---|---|
FP16 |
是 |
GPU 加速计算 |
bfloat16 |
否(Google 扩展) |
保留动态范围,精度差 |
FP8(E4M3/E5M2) |
否(非官方,但参照 IEEE) |
AI 推理/训练,节省显存 |
FP4¶
FP4(4-bit Floating Point)是一种仅使用4位比特表示的浮点数格式,主要用于深度学习模型的极限量化(extreme quantization),以进一步压缩模型大小、提升推理速度和节省内存带宽。
由于其极低的位宽,FP4 通常用于在模型权重和激活值上的量化,尤其适用于边缘设备和资源受限环境。
FP4 的基本结构¶
虽然 FP4 并没有一个严格统一的标准(不像 FP16、FP32 有 IEEE-754 标准)
但常见的变体通常有以下结构形式:
名称 |
位数 |
格式说明 |
---|---|---|
E3M1 |
1符号位 + 3指数位 + 1尾数位 |
类似于小型 IEEE 格式 |
E2M2 |
1符号位 + 2指数位 + 2尾数位 |
更高尾数精度,较低动态范围 |
自定义FP4 |
一些架构使用非IEEE方式编码,牺牲精度保留分布特征 |
举个例子(E2M2):
S E E M M
(共5位,某些情况下会padding为8位对齐)示例:
0 10 11
→ 正数,指数为2,尾数为0.75