版权声明:本文为博主原创文章,遵循 CC 4.0 BY版权协议,转载请附上原文出处链接和本声明。
版权
组成原理专栏收录该内容
61 篇文章26 订阅
订阅专栏
刚刚碰到一个题目,需要写出一种浮点数范围的题。
原题如下
假定一种浮点数格式是1位数符,7位阶码,8位尾数。其中尾数用补码表示,阶码用移码表示。
问,此格式可以表示的数据范围。
无疑,我们不用关注下溢的问题,只用找出最大正值和最小负值即可。
这里有两个重点:阶码的表示范围和尾数能够表达的范围。
我们知道IEEE754的尾数是用原码表示,默认高位是1,在补码这里没有。我们纯粹关心8位补码能表示多大的小数即可。
而当一论到补码时,莫名就恐慌起来。今天总结到这里,梳理清楚思考路径。
我们知道原码的范围很好求,因为很自然,而反码呢,只是表示与原码不同,意义相同。所以范围一致。而反码和补码也只相差一位,即是否加1,所以,它们三都可以用原码去思考。唯一不同的是,原码和反码都有一个-0,而这个-0在补码那里用于表示-1,或者最小的负数。比如8位表示整数,其中一位是符号位,那么,正数最大是27−1=127, 负数最小是-128。
而小数的话,因为数符已经有了,不用再拿出一位表示符号,因此这8位小数就表示纯粹的小数。
另外,这个区别于IEEE754标准,因为单精度浮点数两个地方是特殊的。
偏置值是28−1−1,也即单精度是127尾数用原码且默认高位是1,隐含起来了
但在这里呢,就是纯粹的编码计算问题。
因此,8位补码小数的范围:由原码可知,最大小数是0.11111111(8个1) = 1 - 2^(-8),最小负数是-1.
再看阶码,由7位(1位字符,6位数据)组成,因此最大可表示的阶码(连通最高位一起)是20+21+...+26=27−1=127,偏置值取2(7−1)=64。
所以最大是127-64 = 63.
或者直接根据与补码表示范围相同推知,表示范围是[−26,26−1]=[−64,63]
在IEEE754中,阶码的最大值是254,范围是1-254,留了两个阶码值状态:0,255表示规格化和无穷大。
这里的表示不用这么考虑。
所以范围可定:(−1,1−2−8)⋅263
以上。