负十进制数/字符串到 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。)
您需要弄清楚您的号码需要为s
、exponent
和significand
位分配什么;这样上面的公式就等于您要表示的数字。 (更准确地说:“最接近”它,因为由于基数原因,并非所有数字都可以准确表示,因此您必须四舍五入。)
签名位很简单:我们知道它将是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 单精度格式的主要内容,如果未能解决你的问题,请参考以下文章