数制(待补充)
内容:
- 定点数
- 浮点数
- 浮点数特殊情况处理
- 定点数转浮点数(待补充)
- 参考文献
定点和浮点都表示有理数
1、定点数
定义
定点数与十进制数类似,有部分位表示整数部分,其余位表示小数部分,有一个位于整数和小数位之间隐含的二进制小数点。
下图为一个带小数的二进制表达式,在b)中隐含的小数点被表示出来,c)为十进制表达式。
符号
有符号的定点数可以用二进制补码或者带符号的源码表示,最高位用于表示符号。
定点数小数点:
定点数只是位的集合,若不给出数的解释(整数位和小数位的长度),则无法知道是否存在二进制小数点。
负数补码表示形式
二进制补码表示是将数的绝对值取反,然后在最低有效位上加1。
带符号的定点数计算
下面计算0.75+(-0.625),由于存在负数-0.625,为使加法正确进行,需要将其转换为二进制补码的形式。由于计算结果超过了定点数的位宽,所以计算结果中最高位的1需要舍去。
2、浮点数
定义
浮点数与科学计数法类似,解决了定点数中整数和小数位长度固定的限制,允许表示非常大和非常小的书。
组成
浮点数由符号(sign)、尾数(mantissa,M),基数(base,B)和阶码(exponent,E)组成,如下图所示。其中二级制浮点数的基数为2.
隐含前导1(implicit leading one):
在二进制浮点数中,尾数的MSB总是1,所以不需要在尾数中存储,被称为隐含前导1。
偏置(biased)阶码
阶码需要表示正数和负数阶码,为了做到这点,浮点数使用偏置阶码,就是在原始阶码加上常数偏置。32位浮点数使用的偏置是127。就是对于任意阶码,偏置阶码为:实际阶码+偏置。例如:实际阶码为7,则偏置阶码为7+127=134=10000110;对于阶码-4,偏置阶码为127+(-4)=123=01111011。下图为采用隐含前导1和偏置阶码的228浮点表示形式,符合IEEE 754浮点数标准。
偏置阶码理解:以单精度浮点数为例,阶码一共为8位,可以表示-127~127共256个数,但是阶码不使用最高位作为符号位,而是以最低位为-127,最高位为127实现正负数的区分。因此对于单精度浮点数的常数偏置为2^(8-1)-1=127,双精度常数偏置为2^(11-1)-1=1023。
单精度和双精度格式
32位浮点数成为单精度浮点数(singal-precision,single或float),IEEE 754标准还定义了64位双精度浮点(double-precision、double)。
浮点数舍入:
在有效精度外的算数结果数必须四舍五入到最近的值。舍入模式有:1) 向上舍;2) 向下舍;3) 向零舍;4) 向最近端舍(默认方式,如果两端距离相同,保留为小数部分最低有效位为0的数)。如果数值部分太大会产生上溢,舍为±∞;数值太小会产生下溢,舍为0。
浮点数加法:
- 提取阶码和小数位;
- 加上前导1,形成尾数;
- 比较阶码;
- 如果需要,对较小的尾数移位;
- 尾数相加;
- 规范化尾数,并在需要时调整阶码;
- 舍入结果;
- 把阶码和小数组成浮点数。
3、浮点数特殊情况
特殊值与阶码的关系:
32位浮点数的阶码域可以表达-127~128,其中-127(全0)和128(全1)用于保存为特殊值,-126~127表示常规指数范围。
IEEE浮点数标准用特殊方式表示0,±∞,非规范数和NaN结果,通常采用全0或者全1填充阶码解决特殊情况。
- 0:因为隐含前导1,所以在浮点数表示中数字0的表示需要特殊表示;
- 无穷大:上溢结果舍入为无穷,并非最大的浮点数(因为相差太大而毫无意义);
- NaN:表示不存在的数;
- 非规范化数:当浮点数的指数允许为最小指数时,尾数不必是规范化的,指数域值为emin-1用于区分规范化和非规范化数;
下图为这三类结果的表示方法。
4、定点数转浮点数
参考文献:
《数字设计和计算机体系结构》