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

Posted

技术标签:

【中文标题】负十进制数/字符串到 IEEE 单精度格式【英文标题】:Negative decimal number / string to IEEE Single Precision Format 【发布时间】:2021-06-30 18:32:01 【问题描述】:

我正在学习汇编编程课程,但对“IEEE 单精度格式”的理解非常糟糕。我们的文本只有两句话,我看到的几个网站讨论它,并没有太大帮助。完全公开,这是我们每周作业的问题之一,我就是想不通。我有点理解正常的数字,但只要分配有一个负数,它就会把所有东西都扔出窗外。

“使用 IEEE 单精度格式将十进制数 -1.25 编码为单精度浮点数。显示您的所有工作以获得荣誉。”

对此的任何帮助将不胜感激。

【问题讨论】:

Wikipedia 很详细。展示你的努力以及你卡在哪里。 可能重复:How do I convert from a decimal number to IEEE 754 single-precision floating-point format? 这能回答你的问题吗? How do I convert from a decimal number to IEEE 754 single-precision floating-point format? 【参考方案1】:

您的消息表明负数会给您带来麻烦。只需忽略该数字为负数,而是转换为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。嗯,这很简单:在 dot 次幂从 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.

【讨论】:

请注意,舍入模式在这里不是一个因素,因为-1.25 可以精确表示。顺便说一句,你用什么来转储转换结果的细节? h-schmidt.net/FloatConverter/IEEE754.html 非常适合人类使用单精度,但不允许链接特定数字。 @PeterCordes 我使用hackage.haskell.org/package/crackNum。它不太容易安装(需要 Haskell 编译器和 SMT 求解器),但它在详细显示这些值方面做得很好。特别是,它可以使用任意指数+有效位宽度进行解码,包括半浮点数和脑浮点数。 – alias 6 分钟前 删除

以上是关于负十进制数/字符串到 IEEE 单精度格式的主要内容,如果未能解决你的问题,请参考以下文章

考前自学系列·计算机组成原理·IEEE 754 单精度浮点数和真值之间的转化

IEEE 754标准如何转换?

0 到 10 范围内任何正或负十进制数的正则表达式

IEEE-754浮点标准简介

IEEE-754浮点计算精度问题

IEEE754表示浮点数