961计组考纲(2)——数据的表示和运算
这一部分上课的时候根本没讲过,结果一看真题还考了,遂不得已看看,结果也不是很懂。QAQ
数制与编码
二进制与十进制的转换,不解释。
值得注意的是,二进制的小数位只能表示(1/2, 1/4, 1/8, ..., 1/2^n),因此二进制无法表示所有的十进制小数,只能近似表示(所以有了浮点数?)
定点数和浮点数的表示与运算
定点数表示
这里全都考虑有符号数,假设字长有n+1位
- 源码([-2^n+1, 2^n-1]):第一位表示符号,剩下表示绝对值数值,表示范围
- 反码([-2^n+1, 2^n-1]):第一位表示符号
- 若是正数,数值位与源码相同
- 若是负数,数值位与源码按位取反
- 补码([-2^n, 2^n-1]):正数与源码相同,负数则取反码+1,0只有一种表示,多出来的10000(1后面n个0)可以表示(-2^n),1后面的数值位表示(-2^n)后面补上多少绝对值,而源码中00000和10000都表示0,显然不适合程序
- 移码([-2^n, 2^n-1]):真值加上某个2的幂
定点数运算
补码机器实现加、减运算的方法统一(模运算-去掉溢出)
- 符号位和数值位按同样规则参与运算
- 逢二进一
- ([A +B]_{补} = [A]_{补}+[B]_{补} mod(2^{n+1}))
- ([A-B]_{补} = [A]_{补}+[-B]_{补}mod(2^{n+1}))
- 运算结果仍是补码
乘除法:异或运算
- 部分乘积和被乘数取「双符号位」
浮点数表示法
通常采用(mathbf{S} imes 2^{mathrm{J}})
- 阶码J:采用定点整数表示(下面的01000)
- 尾数S:采用定点小数表示(下面的0.10110010001)
IEEE 754标准
-
IEEE 754中尾数m采用源码表示(理解为科学计数法的基,不带符号,而且去掉了第一个有效数字1,真是节省存储空间到了极致),阶码部分用移码表示(就是(E-127)或者(E-1023),这样设置的目的可以通过(E in [1,254])的取值大小控制正整数和小数部分的表示,)
-
单精度浮点数32位,双精度浮点数64位
为了充分利用尾数,增加数据的表示精度,规格化浮点数最高位必须是有效值(小数点前是1,第1位有效数字)
-
单精度浮点数表示公式:((-1)^{S} imes 1 . m imes 2^{(E-127)})
- float所能表示的最大正整数:符号0,阶码取最大值为127(即254-127),令m(23位)尾数全为1时最大,则(m=2-2^{-23}),结果是((2-2^{-23}) imes 2^{127}=2^{128}-2^{104})
- 【为什么阶码最大只能取127:IEEE标准偏置值位127时,空出8位全1来表示无穷大,空出全0表示非规格化数,故阶E的取值不超过(2^{8}-2 = 254),范围在1~254之内】
-
双精度浮点数表示公式:((-1)^{S} imes 1 . m imes 2^{(E-1023)})。
恢复成IEEE存储形式的时候记得不要放错地方,运算的时候记得把
m
写成1.m
再计算啊啊啊
浮点数运算
-
浮点数运算的特点是阶码运算和尾数运算分开进行,浮点数的加减运算一律采用补码。
-
浮点数加减运算一般包括:对阶、尾数运算、规格化、舍入、判断溢出
-
对阶:对阶的目的是为使两个浮点数的尾数能够进行加减运算,毕竟两个数指数相同才能提公因式加减啊。
- 显然,尾数逻辑右移时,舍弃掉的有效位会产生误差,影响精度
-
尾数运算:对阶后的尾数按照定点数的规则加减即可
-
规格化
- 左规:
- 右规:
-
舍入
-
判断溢出
-
-
(2017-961)浮点数除法运算的三个基本步骤:阶码运算、尾数运算、结果规格化
举个栗子:
https://blog.csdn.net/shuzfan/article/details/53814424