浮点单元设计
计算机中数值的表示方式分为两种:定点数和浮点数。定点数小数位置固定,硬件实现简单,但是数值表示范围小,运算精度较低。浮点数小数点位置浮动,可以表示的数值动态范围大,运算精度高,但是浮点运算单元 (Floating-Point Unit FPU) 的面积功耗大很多。
一个通用的 FPU 通常要包括的运算有:加法、减法、除法、开方等。经统计,不同运算的使用占比为,加减法运算占比 55%,乘法占比 37%,开方和除法分别为 1.3% 和 2%,其他比较、定点浮点转换运算占比不高。
IEEE 754 浮点数据格式和运算标准
下面是浮点数通用格式,最高位为 1 位的符号位,接下来是加了偏置的指数位,最后是位数位。其中 为尾数的隐含位,对于非规约类型的浮点数,,对于规约类型的浮点数,,偏置 bias 大小为 。表达的二进制如下:
格式
IEEE 754-2008 定义了多种二进制浮点数。
| 位宽 | 符号 | 指数 | 尾数 |
|---|---|---|---|
| S 1-bit | E w-bit | T p-bit | |
| binary16 | 1 | 5 | 10 |
| binary32 | 1 | 8 | 23 |
| binary64 | 1 | 11 | 52 |
| binary128 | 1 | 15 | 112 |
| binary{k}(k>=128) | 1 | round[4*log_2(k)]-13 | k-E+25 |
指数位和位数位的不同数值组合,可以表示不同类型的浮点数,在 IEEE754 标准下,浮点数分为几类,定义如下:
| 类型 | 指数位 | 尾数位 | 隐含位T0 |
|---|---|---|---|
| 零 | 0 | 0 | 0 |
| 规约数 | 非 0非 max | * | 1 |
| 非规约数 | 0 | 非 0 | 0 |
| 无穷数 INF | max | 0 | - |
| 非数 NaN | max | 非 0 | - |
- 零:指数位和位数位都为 0,此时符号位决定正负,有正零和负零之分。
- 规约数:指数为不全为 1 也不全为 0,隐含位有效为 1,分正负。单精度 32 位,偏移的指数位 E 取值范围 ,双精度 63 位,范围 。
- 非规约数:指数全 0,尾数不全 0,隐含位有效,分正负。注意,以单精度为例,此时指数并非直接计算得来的 0-127=-126,而是 -126,保持和规约数统一。
- 无穷数:指数位全 1,位数位全 0,分正负。
- NaN:指数位全 1,位数位不全位为 0,此时根据位数位首位是否为 1,NaN 还可以分为 SNaN 和 QNaN,前者参与运算时会发生异常。
舍入
IEEE 754 定义了几种舍入模式,需要强制实现的有四种。首先介绍舍入过程中的几个名词。舍入过程是丢弃舍弃位,根据舍弃位各位数值以及保留位最低位数值,确定是向上边界舍入还是向下边界舍入。
- Guard bit (G) 保留数值的最高位
- Round bit (R) 舍弃数据的最高位
- Sticky bit (STK) 舍弃数据次高位到最低位按位(逻辑)或的结果
| 保留位 | 舍弃位 |
|---|---|
| DDDDG | RXXX |
舍入模式的计算如下,其中 分别代表可表示的浮点数下边界和上边界,,sign 为符号位。
| 舍入模式 | 描述 | 计算公式 |
|---|---|---|
| roundTiesToEven | 向最近的可表示浮点数舍入,如果到上下边界距离相等,则向尾数为偶数的边界舍入(LSB=0) | R&(G|STK) |
| roundTowardPositive | 总是向 F 2 舍入 | ~sign&(R|STK) |
| roundTowardNegative | 总是向 F 1 舍入 | sign&(R|STK) |
| roundTowardZero | 当结果为正数时向 F 1 舍入,否则向 F 2 舍入 | 0 |
异常
IEEE 754 标准规定,针对基本的五种算术运算,当异常发生时,必须给出相关异常指示信号,分为以下五种异常:
- Invalid: 无效。发生无效的情况是有操作数之一为 NaN,相同符号无穷大相减,不同符号无穷大相加,无穷大相除,0 乘无穷大,0 除以 0,被开方数是负数。运算结果值为 NaN。
- DivisionByZero。除法运算,除数为 0 时,结果为无穷大。
- Overflow。中间结果比浮点数可以表示的最大值还大,结果根据舍入模式置为无穷大或能表达的最大规约数。具体分类如下。
- Underflow。出现了极小 tininess 且发生了精度损失 loss of accuracy。运算结果绝对值小于最小规约数或舍入后绝对值仍小于最小规约数。
- Inexact。舍入时最低为后不全为 0,结果是一个近似值。
| roundTiesToEven | roundTowardPositive | roundTowardNegative | roundTowardZero | |
|---|---|---|---|---|
| sign is + | 正无穷 | 最大规约数 | 正无穷 | 最大规约数 |
| sign is - | 负无穷 | 最小规约数 | 最小规约数 | 负无穷 |