作业帮 > 数学 > 作业

阶码 尾数 浮点数的运算

来源:学生作业帮 编辑:作业帮 分类:数学作业 时间:2024/05/16 13:56:04
阶码 尾数 浮点数的运算
设浮点数字长16位,其中阶码5位(含1位阶符),以2为底,补码表示;尾数11位(含1位尾符),补码表示,判断下列各十进制数能否表示成规格化浮点数.若可以,请表示.(1)3.5 (2)-10^(-4) (3)10^10
求指导
以下纯手打,如果你仔细读完应该就能彻底明白了.
首先,我觉得你应该已经掌握了浮点数表示的相关概念,否则你需要先读懂你的计算机组成原理教材...
下面说十进制怎么转换成二进制浮点数:
二进制里的小数和十进制一样,在转换成指数表示时只需要将尾数左移或右移,同时减或加指数即可.
所以一个十进制数若能够无精度损失地转换成二进制,则这个数在转换成最简分数时,它的分母必须为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.