阶码 尾数 浮点数的运算

2024-12-03 23:52:45
推荐回答(2个)
回答1:

原码:+|x|  或者  -|x|      (正数=0+|x|    负数的=1+|x| )

符号位和数值部分:分开处理

仅对【数值部分】进行加减运算,符号位起判断和控制作用

规则如下:

1、比较两数符号,对加法实行“同号求和,异号求差”,对减法实行“异号求和,同号求差”。

2、求和:数值位相加,和的符号取被加数(被减数)的符号。若最高位产生进位,则结果溢出。

3、求差:被加数(被减数)与加数(减数)求补相加。

a)最高数值位产生进位表明加法结果为正,所得数值位正确。

b)最高数值位没产生进位表明加法结果为负,得到的是数值位的补码形式,需对结果求补,还原为绝对值形式的数值位。

4、差的符号位:

a)情况下,符号位取被加数(被减数)的符号;

b)情况下,符号位为被加数(被减数)的符号取反。

扩展资料

移码:不管正负,只要将其补码的符号位取反即可。

符号位和数值部分:一起处理

运算公式(假定在一个n位ALU中进行加法运算)

[E1]移+[E2]移=2n-1+E1+2n-1+E2=2n+E1+E2=[E1+E2]补 (mod 2n)

[E1]移–[E2]移=[E1]移+[–[E2]移]补=2n-1+E1+2n–[E2]移

=2n-1+E1+2n–2n-1–E2

= 2n+E1–E2 = [E1–E2]补 (mod 2n)

 结论:移码的和、差等于和、差的补码!

运算规则

① 加法:直接将[E1]移和[E2]移进行模2n加,然后对结果的符号取反。

② 减法:先将减数[E2]移求补(各位取反,末位加1),然后再与被减数 [E1]移进行模2n相加,最后对结果的符号取反。

③ 溢出判断:进行模2n相加时,如果两个加数的符号相同,并且与和数的符号也相同,则发生溢出。

回答2:

以下纯手打,如果你仔细读完应该就能彻底明白了。

首先,我觉得你应该已经掌握了浮点数表示的相关概念,否则你需要先读懂你的计算机组成原理教材。。。
下面说十进制怎么转换成二进制浮点数:
二进制里的小数和十进制一样,在转换成指数表示时只需要将尾数左移或右移,同时减或加指数即可。
所以一个十进制数若能够无精度损失地转换成二进制,则这个数在转换成最简分数时,它的分母必须为2的整数次幂(所有整数的分母为1,即2的0次幂),这样就可以先将其整数分子用二进制表示(整数的数制转换当然是没有任何障碍的,小数点就紧接在最低位右边),然后将这个二进制的分子右移那个2次幂分母的幂个数位即可。就像该题第一问的3.5,其实就是7/2,那么用二进制的111表示7,然后右移1位得11.1,就是它的二进制小数表示,再转换成规格化浮点数,就变成0.111x2^2。
但是,若某个数在转换成最简分数时,分母不是2的整数次幂,它就不能无精度损失地转换了。这个道理对10进制来说也同样成立,只有当一个分数的分母可以转换10的整数次幂时(当然,因为10并不是质数,所以此时的分数未必是最简的,如1/2要换成5/10,1/4要换成25/100)才可以无精度损失地转换成十进制小数,所以像1/3,1/7等就只能转换成无限循环,这就有了精度损失。虽然我在这里说小学生都懂的10进制确实有点啰嗦,但将一个分数“有损”地转换成二进制时也必须经过类似的步骤。例如第二问的-1/10000,先不考虑它的负号(这只与补码表示有关),显然分母不能表示为2的整数次幂,但仍必须把这个10进制分母去掉,所以就只能乘以一个差不多大的2的整数次幂,即2^13=8192,然后1/10000就被近似为了1/8192,然后就可以像上一段说明的那样转换成二进制了。但这样的误差未免太大,为了减少误差,可以先把分子分母同时乘以若干倍,使放大后的分母非常接近2的某一整数次幂,然后替换(如将1000/1000000换成1049/2^20,这时的误差就很小了),也可以直接把原数乘以一个非常大的2的整数次幂,比如1T即2^40,然后把小数点后4位直接丢掉,只保留整数部分转换成二进制然后右移40位。考虑到计算难度,我觉得各CPU芯片厂商采用的是第一种方法,但不论如何,浮点数的字长越长,精度就可以达到越高。如果你在编程时将某些经过除法运算后的逻辑上应是整数的浮点数多print几位,你就会发现在小数点后若干个0之后会多出一些很奇怪的数字。总之,类似第二问的数不能无精度损失地转换成二进制浮点,如果你要写一个“有损”的,像我说的方法随便写一个就可以了,因为这取决于具体的近似方法,所以是没有标答的(但请记得尾数要用补码表示)。
然后来说第三问。所有的整数都可以“无损”地转换成二进制,但这个数比较大(大于2^30),已经超出了4位阶码能够表示的最大数(1-2^(-10))x2^(2^4-1),所以是完全无法表示的。说到这里,顺便补充一下,因为尾数和阶码均有字长限制,所以即使是表示范围内的数也可能产生精度损失,如2^14+16,由于在规格化时最低位在小数点后第11位,已超出了尾数字长,所以后面加上的16会完全丢失,而只剩下2^14。