计组4
规格化:
不论补码还是原码表示法,均是小数,其中小数点前一位是符号位,后面才是数值最高位
左规,一般情况不论原码还是补码均是补0,同时阶码变小,因为小数点右移
在因为右移导致一些有效位出去的情况下,需要把有效位保留并移动回原来的数内
左规这里不需要担心溢出,因为顶多是下溢,机器是将其视作为零的
右规,指代尾数有效位进位到小数点前,可能导致符号位的溢出,同时也需要保留进位
右规是指代小数点左移,会导致阶码变大
进行一次全体右移,把原符号位补回,同时需要进行两个判断
第一个就是是否右规导致阶码溢出,如果溢出那么就没救了,直接不用干了
第二个就是因为右规会有低位的舍弃,此时需要进行舍入,可能也会导致尾数变大进位
这时候就可能再次右规,可能又会产生阶码的溢出
简单来说,就是数值位溢出其实没什么事情,可以依靠阶码变大来弥补
如果阶码溢出,那么是真没救了
注意下补码、原码的规格化判断有一定的不同,主要在于数值位的表示法上
另外注,基数不同的情况下的特殊处理
首先就是基数扩大,那么每次移动的位数自然也会变化,也要看是几进制的数再说
基数扩大,那么最终规格化的表示也会有所不同,但核心应该是一样,就是阶码再进一位
那么就会导致尾数的溢出
例如0.01、0.10、0.11,在基数为4的情况下,再度进行移动就会溢出(向前移动两位
0.001这类,在基数为8的情况下,再度进行前移一个阶码(3位,就会溢出
规格化的目的其实就是在能够存得下的情况下,使得最高有效位是一个有效数字
在对阶里面右规出去的是不舍弃的,依旧进行保留,包括左边进位出去的也是保留的
例题1:
例题2:
此时的B就很明显导致了一位的溢出无法存储,但如果规格化就能解决这个问题
双符号位的规格化解释例题:
IEEE模型特殊性:
注:IEEE特殊实际上在于其定下阶码用移码存储,尾数用原码表示
且移码的偏移量是规定为2^7-1,2^10-1,依据单双精度区分
同时尾码的数值位最高位采用的是隐含第一位的取法(因为第一位一定是1
阶码的移码表示,注意其不同于补码、原码,是真值加上偏移值得出的机器数
因而假如要得出其值,那么就是安心求出机器码,然后减去偏移量得出真值
没有符号位这一说法的
对于小数的原码存储法,那么就是.XXXXX….没有符号位的存储位在,共23/52位
但需要注意其特殊性就在于数值位隐含了第一位,所以在反求其值的时候,需要把1带回
然后即为原码求法,同样,IEEE里面的尾数也是没有符号位的,符号位在最开头
只能说是以正数的原码形式存储,同时应是没有存储小数点前一位的,只有小数点后
所以通过尾数求值,直接补上第一个一,然后求这个1.XXXX的值是多少,XXX是尾数
注,考试大概率并不考察IEEE,基本是以选择的方式来考察,不会考模拟
所以几个特性需要清晰:
首先就是阶码表示范围是多少,再就是真值的表示范围是多少
其结构是怎么样的,要会分析
十进制转换例题(最少也有三十二位,你写那么多个0试试
这个也是十六位表示法,写成二进制不敢想象
这里就是其表示范围
另外特别注意一些特殊表示法的含义(记忆为主,理解为辅:
而且正是因为有了这些特殊解释的原因,正常所能得到的阶码最高值是254、2046
浮点数的加减运算(IEEE模型、其他模型):
首先根据一般的十进制浮点数的加减法的过程引出方法
首先是需要把同类型(计算机、考察一般都是补码,很少用原码考察)用码值表示出来
这里可以提前观察是加法还是减法,如果需要是减法直接把Y改为-Y补码展现
注意尽可能写出来规格化的状态,这样后续也方便计算的
然后阶码其实根本没必要急着就写掉,完全可以最后一步写,这样方便
然后注意表达出来以后就要进行阶码的对齐,遵循小向大靠的原则,小阶码扩大
同时小阶码所对应的尾数部分右移一位,然后这里注意,因为是不同的码态
对于补码而言,分正负的
正的不论左移还是右移,低位、高位补的均是0
对于负数而言,左移低位补的是0,右移高位补的是1
当然在浮点数加减法内只谈论右移而不会考虑左移的可能性,因为左移不被允许
另外,如果在低位右移出后,需要把这个低位保留下来而不是直接去除,需要注意
如果是原码,那么就是高位补的0,也没有什么特别需要说的,也是保留低位
然后在对齐了以后,开始进行尾数的加减法(减法就是取另外一个数的-x补进行加法
IEEE中需要特别注意尾数前面还有一个隐藏位,其他的比较佛系但也要看情况
在一般情况,都会给定数符几位、尾码几位的,而不是和IEEE一样在尾码没有数符位
同时最高位还是隐藏的,不一样,要区分
写法可能就是.11111与11.111111的差别之分了,对于IEEE我也是刚刚才意识到
在加减中对高位的进位也是需要保留,否则后续就没有办法规格化
进行加减后,就要再度进行规格化
规格化就更加麻烦一些,需要根据补码、IEEE、原码三种情况进行区分
IEEE最好写做双符号位,因为数值位第一位是会隐藏的,第一位符号位,第二位数值最高
补码、原码的话按照这个准则,我只能说非常容易做错,第一位是作符号位
注意最终必须要规格化到原码、补码相对应的规格化状态,不能出现一点不符合的
右规倒还能搞清楚,只需要保证符号位、最高位回归原位就行
左规就有点难以记住,但一定要参考这个状态去做,其实现在也可以理解
如果产生了符号位进位和最高位进位不同的情况,即双符号位一个1一个0,那么就溢出
那么就是要卡着这个溢出点:1.01XXXX…
右规是小数点左移,阶码扩大,左规是小数点右移,阶码减小
可能需要进行左规或者右规,右规往往是尾码溢出,这边会有个符号位也顺便被进位丢出
这个是不能丢的,和之前一样,需要保留下来,在右规的时候重新放回去
这里就要去判断这边有没有可能产生阶码的溢出
同时最后移除的一位也可能并不是0,或者一开始对阶的时候就有多余项,需要舍入处理
舍入处理自然是可以有多种的,具体看题目的选择,书上几个需要知道记住的
在舍入后,同样需要考虑是否会产生进位,再度右规阶码溢出的问题
总体来说是非常麻烦的,建议多加训练、观阅
左移、左规,尾数增大,只考虑数值位的移动,阶码因而减小,小数点后移
右移、右规,尾数减小,只考虑属植物的移动,阶码因而扩大,小数点前移