【问题标题】:Floating point conversion - Binary -> decimal浮点转换 - 二进制 -> 十进制
【发布时间】:2015-10-11 13:17:18
【问题描述】:

这是我正在处理的号码

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

符号位是 1,所以我的结果是 -1/16,但给定的答案是 -9/16。有人介意解释分数中额外的 8 是从哪里来的吗?

【问题讨论】:

标签: c binary floating-point-conversion


【解决方案1】:

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

您几乎是正确的,但必须考虑隐含的 1。如果它是非规范化(意味着指数位全为 0),则不要添加隐含的 1。

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

1  01110  001

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

Exponent = e - bias       

14 - 15 = -1
  1. 取小数位 ->> 001
  2. 添加隐含的 1 ->> 1.001
  3. 将它移动一个指数,即-1。变为 .1001
  4. 计算值,1(1/2) + 0(1/4) + 0(1/8) + 1(1/16) = 9/16
  5. 负号位变为 -9/16

希望有帮助!

【讨论】:

    【解决方案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 的内容。只是为了确保当任何指数位正确为 1 时使用隐式 1?如果它们都是零,就不会有隐含的 1
    • @jlee 是的,这是正确的。更多信息请参见Exponent encoding,假设您的编码类似于 IEEE 754 二进制编码。
    • @jlee 同样当“它们(指数位)全为零”时,代码不使用0-bias,而是使用1-bias 来获取真正的指数。
    猜你喜欢
    • 2021-09-10
    • 2017-02-23
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多