浮点转换 - 二进制 - >十进制

时间:2015-07-21 21:33:49

标签: c binary floating-point-conversion

这是我正在处理的电话号码

1 01110 001 = ____
1个符号位,5个exp位,3个小数位
偏见= 15

这是我目前的流程,希望你能告诉我我在哪里遗漏了什么

  1. 将二进制指数转换为十进制
    01110 = 14
  2. 减去偏差
    14 - 15 = -1
  3. 按结果乘以小数位 0.001 * 2^-1 = 0.0001
  4. 转换为十进制
    .0001 = 1/16
  5. 符号位为1,因此我的结果是-1/16,但给定的答案是-9/16。有人会介意解释分数中的额外8来自何处?

2 个答案:

答案 0 :(得分:2)

你似乎有正确的概念,包括对超额N表示的理解,但你错过了一个关键点。

用于编码幅度的小数部分的3位是001,但在小数位之前有一个隐式1.,因此完整幅度实际为1.001,可以表示为1+1/8 => 9/8的不正确分数。

2^(-1)1/(2^1)1/2相同。

9/8 * 1/2 = 9/16。考虑到符号位,您得到答案-9/16

答案 1 :(得分:2)

对于归一化浮点表示,尾数(小数位)= 1 + f。这有时被称为隐含的前导1表示。这是一种免费获得额外精度的技巧,因为我们总是可以调整指数E,使得有效M在1 <= M <1的范围内。 2 ...

你几乎是正确的,但必须考虑隐含的1.如果非规范化(意味着指数位都是0),你不添加隐含的1.

我会这样解决这个问题......

1  01110  001

bias = 2^(k-1) -1 =        14

Exponent = e - bias       

14 - 15 = -1
  1. 取小数位 - &gt;&gt; 001
  2. 添加隐含的1 - &gt;&gt; 1.001
  3. 按指数移动,即-1。成为.1001
  4. 计算值,1(1/2)+ 0(1/4)+ 0(1/8)+ 1(1/16)= 9/16
  5. 使用负号位,它变为-9/16
  6. 希望有所帮助!