好友
阅读权限40
听众
最后登录1970-1-1
|
本帖最后由 lizhirui 于 2018-11-18 22:19 编辑
此文考虑到部分小伙伴的数学能力问题,特意留下了多个例子以说明表达式的含义
一些小伙伴在计算机组成原理课中学习过,浮点数的一般表示形式如下:
并且为了机器零的判定方便,阶码采用偏移值为(2 ^ (k - 1))(当k=8时为127)(这里的k指的是整个阶码(包含阶符)的位数,下同)的移码,即若是一个k位数x,则其移码为x + 2^k
但是,IEEE754标准中的移码却采用了((2^(k - 1)) - 1)(当k=8时为127)这一偏移值,这个值正好比上述标准少1,这是为什么呢?
首先,我们看一下IEEE754标准的浮点数结构:
不知道你们有没有注意到一点:
在一般浮点数的定义中,阶码(不包含阶符)的部分采用原码表示(此处不讨论补码、反码形式的情况),这就出现了一个问题,机器0有两个:分别是1,000....00000和0,000....00000
而采用(2 ^ (k - 1))修正时,相当于只是改变了阶符
并且,其表示范围实际为-((2^(k - 1)) - 1)~((2^(k - 1)) - 1) (若k=8,则范围为-127~127),那么如何解决有机器0的问题同时方便比较呢?
那就是将(-(((2^(k - 1)) - 1)~((2^(k - 1)) - 1)) + ((2^(k - 1)) - 1) = 0~(2^k) - 2(若k=8,则等效于(-127~127) + 127 = 0~254)
IEEE754就是这样处理的,这样可以用一个k位无符号数来表示一个阶码,但是你有没有注意到,阶码中有一个数没有被使用,那就是((2^k) - 1)(当k=8时为255)。
IEEE754标准中做了如下设计:
当阶码为2^k - 1(当k=8时为255)且尾数为0时,这个数的真值为无穷大(正负由数符决定),
当阶码为2^k - 1且尾数不为0,这不是一个数(NaN,这个结果通常由0/0等未定义运算产生)
同时,IEEE754标准为了节省尾数的位数和方便规格化,还假定了小数点左边有一个隐含的“1”,因此为了表示机器0,IEEE754规定当阶码为0且尾数为0时,表示机器0 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|