IEEE 单精度格式的负十进制数/字符串

Negative decimal number / string to IEEE Single Precision Format

我正在学习汇编编程 class,并且很难理解“IEEE 单精度格式”。我们的文本只有两句话,我看到的几个讨论它的网站并没有太大帮助。坦白说,这是我们每周作业的问题之一,我就是想不通。我有点理解正常的数字,但是一旦作业有一个负数,它就会把所有东西都扔掉 window.

"使用 IEEE 单精度格式将十进制数 -1.25 编码为单精度浮点数。展示您的所有作品以获取荣誉。"

如有任何帮助,我们将不胜感激。

您的消息表明负数给您带来了麻烦。简单地忽略数字是负数,而是转换 1.25 。然后翻转最高位将为您提供 -1.25 的结果。浮点数这样很好:要否定,你需要做的就是翻转最高位。

详细信息:请记住,单精度数有 32 位。符号位 1 位,指数位 8 位,尾数位 23 位。对于“正常”数字,有一个隐含的 1,即值是:

 (-1)^s * 1.significand * 2^exponent

1.significand 中的 1 是“隐式”1。)

您需要弄清楚您的号码需要 sexponentsignificand 位;这样上面的公式等于您要表示的数字。 (更准确地说:“最接近”它,因为由于基数原因,并非所有数字都可以准确表示,因此您必须四舍五入。)

符号位很简单:我们知道它会是 1 因为你的数字是负数。

然后是8位指数。这可以通过找到“刚好低于”您的数字的 2 的幂来找到。在本例中 2^0 = 1 < 1.75 < 2 = 2^1,因此最接近的幂为 0。IEEE 存储的指数的偏差为 127,这意味着它将存储 E+127 而不是 E。 (这样做有充分的理由,很容易用谷歌搜索。)因此,指数将为 0+127 = 127,或 01111111.

然后是23位有效数字。对于普通数字,有一个隐含的 1;这意味着您需要简单地用 23 位表示 0.25 。好吧,这很简单:在 幂从 1 开始变为负数之后,所以 010...0 就可以了,因为 0*2^-1 + 1*2^-2 = 1/4 = 0.25.

将所有内容放在一起,您最终得到:10111111101000000000000000000000。印刷漂亮,这是:

  ENCODED = -1.25 :: Float
                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------S23----------
   Binary layout: 1 01111111 01000000000000000000000
      Hex layout: BFA0 0000
       Precision: Single
            Sign: Negative
        Exponent: 0 (Stored: 127, Bias: 127)
  Classification: FP_NORMAL
          Binary: -0b1.01
           Octal: -0o1.2
         Decimal: -1.25
             Hex: -0x1.4
   Rounding mode: RNE: Round nearest ties to even.
            Note: Conversion from "-1.25" was exact. No rounding happened.