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。)
您需要弄清楚您的号码需要 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
。好吧,这很简单:在 点 幂从 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.
我正在学习汇编编程 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。)
您需要弄清楚您的号码需要 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
。好吧,这很简单:在 点 幂从 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.