关于浮点数的规格化表示

2024-11-15 23:04:09
推荐回答(2个)
回答1:

问题2和1很类似,就不重复了,我们来看一下问题1和问题3。
(1) 56(10)
1) 符号位
首先这是一个正数,所以符号位是0
2) 尾数和阶码的推导
56的二进制表示是:111000。用小数表示相当于是111000.0000000...
现在我们移动小数点,使得小数点前只有1位。对于这个数当然是向左移动:
移动1位是:11100.000000...
移动2位是:1110.000000...
类推
移动5位是:1.11000000...
好了,现在我们知道阶码应该是5,尾数应该是1100000...
你可能会问,怎么少了一个1?因为有数字前面的0是没有意义的,所以最高位一定是1(比如00000111,相当于111,所以第一个1前面的0都可以省略)。我们移动小数点的时候保证小数点前面的是那个最高位的1。所以没有必要表示出来。
3) 阶码
现在我们知道阶码是5,但是是采用移码的。所谓移码就是加上01111(最高位是0,其它位是1)。所以最后的阶码是:10100
4) 尾数
补够你要求的10位就行了。因此是1100000000
5) 完整的数
把上面的符号位、阶码和尾数表达出来就可以了,是:
0 10100 1100000000 16进制就是0x5300
(3) -0.00381(10)
1) 符号位
负数,所以是1
2) 尾数的推导
由于整数部分不存在,所以单独推导小数就可以了。采用乘2法,每次乘2取整数,然后继续把小数乘2。
比如你的0.00381乘2是0.00762,整数是0
再乘2是0.01524,整数是0
再乘2是0.03048,整数是0
再乘2是0.06096,整数是0
再乘2是0.12192,整数是0
再乘2是0.24384,整数是0
再乘2是0.48768,整数是0
再乘2是0.97536,整数是0
再乘2是1.95072,整数是1(终于是1了),以后乘的是小数部分
小数部分乘2是1.90144,整数是1
小数部分乘2是1.80288,整数是1
小数部分乘2是1.60576,整数是1
小数部分乘2是1.21152,整数是1
小数部分乘2是0.42304,整数是0
小数部分乘2是0.84608,整数是0
小数部分乘2是1.69216,整数是1
小数部分乘2是1.38432,整数是1
小数部分乘2是0.76864,整数是0
小数部分乘2是1.53728,整数是1
终于算满了10个有效位(心算的,有可能算错,但是大概意思是这样的)。
现在我们知道这个数是0.0000000011111001101...
现在我们向右移动小数点,直到整数位是1,
移动1位是:0.000000011111001101...
类推
移动9位是:1.1111001101...
好了,我们知道阶码是-9,尾数是1111001101(同上面的说明,最高的1忽略了)
3) 阶码
阶码是-9,加上01111是00110
4) 尾数
尾数是1111001101
5) 完整的数
合并上面的结果,是:
1 00110 1111001101 16进制是0x9BCD
另,有的浮点数规范中不省略尾数中最高的1,他们相当于从0.1xxxxx...开始计算的。那么阶码和尾数会右略微变化。
写得好累,希望对你有帮助。
这是我十年前的一个回答,谢谢大家有很多的赞。也有回复说回答错误。所以在最后补一句。浮点规范很多,需要根据具体结果。原题是要求用补码,而补码是用偏移2^n计算的,不过IEEE754规范中使用的是2^n-1作为偏移计算,例子中用的是类似IEEE754规范的值。如果用2^n计算需要对应调整。
再次说明:浮点规范很多,根据情况使用就好。这个回答只是说明概念。

回答2:

非常非常地感谢!通过你的详细讲解我清楚许多了.只是现在对二个例子中,因为56是正数,所以原码和补码是一样的,但 -0.00381是负数,原码和补码不一样,我看到答案中的尾数不是采用补码而是原码11111001101,我想若是补码该是00000110011还是10000110011呢,所以这点还没搞懂,这首位不是1隐藏位又怎么办呢?答案0x9BCD正确吗,若正确,尾数是采用原码吗?希望再能给予解答,谢谢!