【问题标题】:Converting a negative fraction to IEEE 754将负分数转换为 IEEE 754
【发布时间】:2015-03-04 03:10:35
【问题描述】:

我正在尝试将十进制的 -0.25 转换为 IEEE 754 8 位浮点数。这意味着有符号位是 1 位,指数是 3 位,尾数是 4 位。因为它是一个分数,所以我的第一个数字是 0。对于我的下一个数字

.25 * 2 = **0**.5
.5 * 2 = **1**.0
0 * 2 = **0**.0...

所以我最终得到 0.01000。然后我将小数点向右移动两位所以我最终得到 1 * 2^-2 这是正确的,除了我不应该减去 3 的偏差使其成为 1 * 2^-5 吗?

【问题讨论】:

    标签: ieee-754


    【解决方案1】:

    我不知道 IEEE 754 定义了 8 位格式。 (事实上​​我仍然不相信它确实如此。)但我们可以从它定义的格式中推断出来。

    你没有提到隐藏位,但是 16、32、64 和 128 位 IEEE 754 格式都使用了隐藏位,所以我将使用隐藏位来解决这个问题。

    我认为将浮点数的组成部分描述为三个独立的无符号整数是最简单的。 (我从this paper 学到了这个技巧。)对于您的 8 位格式,这些整数是

    • s,符号位,为0或1,
    • e,指数,范围为 0...7,
    • m,有效数字,范围为 0...15。

    该格式使用隐藏位,我们通过将 24(也称为 16)添加到有效位来处理。 (这里的 4 来自有效数字的位数。)

    您将偏差描述为 3,但由于我将有效位视为整数,因此我需要将 4 添加到偏差(将除了隐藏位之外的所有位移动到小数点的右侧)。这使得我的符号中的偏差为 7。

    因此我们将浮点数f的值定义为

    f = (-1)^s * 2^(e-7) * (m + 16)
    

    现在让我们解决你的问题,即找到sem给定

    f = -0.25
    

    代入f的早先定义:

    -0.25 = (-1)^s * 2^(e-7) * (m + 16)
    

    我们可以立即看到s == 1。将-1除以给出

    0.25 = 2^(e-7) * (m + 16)         (eq. 1)
    

    m + 16解决这个问题:

    m + 16 = 0.25 / 2^(e - 7)
           = 0.25 * 2^-(e - 7)
           = 0.25 * 2^(7 - e)
    

    我们知道0 <= m < 16(因为m 是4 位),所以16 <= m + 16 < 32。代入非负整数e并求解:

    16 <= 0.25 * 2^(7 - e) < 32
    64 <= 2^(7 - e) < 128
    log2 64 <= 7 - e < log2 128
    6 <= 7 - e < 7
    -1 <= -e < 0
    1 >= e > 0
    e = 1
    

    现在将e = 1 代入等式1 并求解m

    0.25 = 2^(1 - 7) * (m + 16)
    0.25 = 2^-6 * (m + 16)
    16 = (m + 16)
    m = 0
    

    所以s = 1e = 1m = 0。插回f的定义来检查:

    f = (-1)^1 * 2^(1 - 7) * (0 + 16)
      = -1 * 2^-6 * 16
      = -1 * 1/64 * 16
      = -1/4
      = -0.25
    

    为了将其转换为位,我们写出s 的一位,然后是e 的三位,然后是m 的四位:

    0 0 0 1 0 0 0 0
    s e e e m m m m
    

    因此 16(以 10 为底)或 0x10 是 0.25 的二进制表示形式,为 8 位浮点数。

    【讨论】:

    • 谢谢,8 位我的教授只是用作理论示例
    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2016-04-02
    • 2014-10-18
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多