# IEEE 754 * **IEEE 754** 是国际上通用的 **浮点数表示标准**,定义了计算机中如何表示和运算带小数的实数。它被广泛用于 CPU、GPU、FPGA 等各种芯片中。 * WiKipedia: [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) * **IEEE 754 是计算机里“实数”的通用表示法,让浮点数可以被可靠、高效、跨平台地处理。** ## 工具 * 可视化浮点工具 * [https://float.exposed/](https://float.exposed/) ## 📦 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,尾数为 0 * `NaN`(不是一个数):指数全 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