什么意思呢?
就是通过移动尾数,修改阶码,把尾数移动,要想保证真值不变,必定增减阶码,那么把尾数弄成什么样⼦呢?
解释如下:
对于⼩数点后第⼀个值是固定的(正数:1,负数:1,0),所以该位往往缺省,称为隐藏位。
规格化要求尾数:
1/R<=|M|<1
R=2时: 1/2<=|M|<1 即1/2<=|M|<1
将⼀个浮点数转换为规格化的过程,称为浮点数规格化。
就是说正数要变成0.1XXXXX,负数原码要变成1.1XXXXX,补码就是1.0XXXXXX
补码的最小负数问题⼜来了?
补码规格化后负数的取值范围是怎么样,为什么⾮得1.0XXXXX的形式?不能1.1XXXXX? 后⽂解答
现在从最⼤负数开始起
这是我弄不懂的地⽅,偶然间看到了前辈的推理,让我好好思考了⼀番,以下内容多为转述,这⾥附上前辈的博客
0. 如果不考虑规格化,最⼤负数必定为-0.0001,原码1.0001,补码1.1111,显然不符合1.0XXXX的形式
1. 根据1/2<=|M|<1,不难理解正数要为0.1XXXX的格式,⼩数点后⼀位为1,转化为⼗进制的1/
2.
2. 现在来探索规格化负数补码的范围
继续往后取,最⼤负数取-0.0010,原码1.0010,补码1.1110,仍旧不符合1.0XXXXX形式
取-0.0011,原码1.0011,补码1.1101,不符合
3. 思考:如果使补码形式为1.0XXXX,那么原码形式为如果为1.0XXXX取反+1后仍为1.0XXX的只有1.0000,显然为0不为负数,
所以原码应该为1.1XXXX形式
取-0.1000,原码1.1000,补码1.1000,这时刚好为-1/2,符合尾数规格化的范围,但补码形式不符合
取-0.1001,原码1.1001,补码1.0111,符合,这是负数补码规格化的最⼤值,形式为1.01111 (11111)
4. 思考:规格化的⽬的说明如下
为了提⾼精度需要使尾数的尽可能占满可⽤的位数。这种措施称为浮点数的规格化。
为什么尾数范围规定在1/2<=|M|<1的范围就可以使有效位数尽可能的占满可⽤的位数呢?
这种移动尾数,增减阶码的操作是为了满⾜上述⽬的?
5. 再思考:⼩数点不动,将尾数左移,每左移⼀位,阶码减⼀,保持真值不变,左移到什么程度,就不能再移动? 不能再移动表⽰->如果
再移动就要损失有效数字,故遇到1时规格化停⽌,原码形式为0.1XXXX,所以1/2<=|尾数|.
结论:负数补码规格化最⼤负数形式为1.0111…111,原码为1.1000…001,最⼩负数⾃然是1.0000000…00(-1)
-n
故范围为:-1~ -(1/2+2)
最后⼀问:当取-0.1000时,原码1.1000,补码1.1000,这时刚好为-1/2,符合尾数规格化的范围,为什么不从这⾥开始取值呢?
答:为了机器判断⽅便,往往不把-1/2列⼊规格化的数,因此,机器只要判断运算结果的尾数最⾼位(数符)与尾数次⾼位(第⼀有效位)是否相同,便可以判断是否是规格化的数。
有不对的地⽅还请⼤家指正吖