将数字转换为 IEEE 754
Converting a number to IEEE 754
谁能帮我解决这个问题:
“将十进制数 10/32 转换为 32 位 IEEE 754 浮点数并
用十六进制表达你的答案。 (提示:32位用作
如下:第 1 位:尾数符号,第 2-9 位:8 位指数超过 127,第 10-32 位:23 位尾数大小。)”
我知道如何将十进制数转换为 IEE 754。但是我对如何回答这个问题感到困惑——它只给我一个商数?我不被允许使用计算器,所以我不确定如何计算。我应该先把它们都转换成二进制然后再除吗?
在没有计算器的情况下给出 10/322 的转换作为练习是纯粹的虐待狂。
有一个通用的方法,不用工具也可以,但可能很乏味。
N is the number to code. We assume n<1
exp=0
mantissa=0
repeat
n *= 2
exp ++
if n>1
n = n-1
mantissa = mantissa <<1 | 1
else
mantissa = mantissa <<1
until mantissa is a 1 followed by 23 bits
然后你只需要用 IEEE 格式编码尾数和 (23-exp)。
请注意,这种计算经常会导致循环。每当你找到相同的n,你就知道这个序列会重复。
例如,假设我们必须编码 3/14
3/14 -> 6/14 e=1 m=0
6/14 -> 12/14 e=2 m=00
12/14 -> 24/14-14/14=10/14 e=3 m=001
10->14 -> 20/14-14/14=6/14 e=4 m=0011
6/14 -> 12/14 e=5 m=00110
太好了,我们找到了一个循环!
6/14->12/14->10/14->6/14.
所以尾数会按要求迭代110次110110110...
如果我们用 24 位填充尾数,我们需要 26 次迭代,指数为 23-26=-3(另一种获取方式是注意 n 在第 3 次迭代时第一次变为 >1,指数为 -3,因为 1≤3/14*2^3<2).
我们可以用指数=127-3=124 和尾数=1.1011011011011 进行IEEE754 编码....
10/32 = 5/16 = 5•2−4 = 1.25•2−2 = 1.012•2−2.
符号为+,指数为-2,尾数为1.012.
正号编码为 0。
指数 −2 编码为 −2 + 127 = 125 = 011111012.
有效数 1.012 是 1.010000000000000000000002,它使用最后 23 位编码,010000000000000000000002.
将这些放在一起,IEEE-754 编码为 0 01111101 01000000000000000000000。要转换为十六进制,首先将四位组织成组:0011 1110 1010 0000 0000 0000 0000 0000。然后可以轻松读取十六进制000:0000 16.
我是这样看的:
10/32 = // input
10/2^5 = // convert division by power of 2 to bitshift
1010b >> 5 =
.01010b // fractional result
--^-------------------------------------------------------------
|
first nonzero bit is the exponent position and start of mantissa
----------------------------------------------------------------
man = (1)010b // first one is implicit
exp = -2 + 127 = 125 // position from decimal point + bias
sign = 0 // non negative
----------------------------------------------------------------
0 01111101 01000000000000000000000 b
^ ^ ^
| | mantissa + zero padding
| exp
sign
----------------------------------------------------------------
0011 1110 1010 0000 0000 0000 0000 0000 b
3 E A 0 0 0 0 0 h
----------------------------------------------------------------
3EA00000h
是的,Eric Postpischil 的回答是相同的方法(顺便说一句 +1),但我不喜欢这种格式,因为如果不正确阅读文本,乍一看并不清楚该怎么做。
谁能帮我解决这个问题:
“将十进制数 10/32 转换为 32 位 IEEE 754 浮点数并 用十六进制表达你的答案。 (提示:32位用作 如下:第 1 位:尾数符号,第 2-9 位:8 位指数超过 127,第 10-32 位:23 位尾数大小。)”
我知道如何将十进制数转换为 IEE 754。但是我对如何回答这个问题感到困惑——它只给我一个商数?我不被允许使用计算器,所以我不确定如何计算。我应该先把它们都转换成二进制然后再除吗?
在没有计算器的情况下给出 10/322 的转换作为练习是纯粹的虐待狂。
有一个通用的方法,不用工具也可以,但可能很乏味。
N is the number to code. We assume n<1
exp=0
mantissa=0
repeat
n *= 2
exp ++
if n>1
n = n-1
mantissa = mantissa <<1 | 1
else
mantissa = mantissa <<1
until mantissa is a 1 followed by 23 bits
然后你只需要用 IEEE 格式编码尾数和 (23-exp)。
请注意,这种计算经常会导致循环。每当你找到相同的n,你就知道这个序列会重复。
例如,假设我们必须编码 3/14
3/14 -> 6/14 e=1 m=0
6/14 -> 12/14 e=2 m=00
12/14 -> 24/14-14/14=10/14 e=3 m=001
10->14 -> 20/14-14/14=6/14 e=4 m=0011
6/14 -> 12/14 e=5 m=00110
太好了,我们找到了一个循环!
6/14->12/14->10/14->6/14.
所以尾数会按要求迭代110次110110110...
如果我们用 24 位填充尾数,我们需要 26 次迭代,指数为 23-26=-3(另一种获取方式是注意 n 在第 3 次迭代时第一次变为 >1,指数为 -3,因为 1≤3/14*2^3<2).
我们可以用指数=127-3=124 和尾数=1.1011011011011 进行IEEE754 编码....
10/32 = 5/16 = 5•2−4 = 1.25•2−2 = 1.012•2−2.
符号为+,指数为-2,尾数为1.012.
正号编码为 0。
指数 −2 编码为 −2 + 127 = 125 = 011111012.
有效数 1.012 是 1.010000000000000000000002,它使用最后 23 位编码,010000000000000000000002.
将这些放在一起,IEEE-754 编码为 0 01111101 01000000000000000000000。要转换为十六进制,首先将四位组织成组:0011 1110 1010 0000 0000 0000 0000 0000。然后可以轻松读取十六进制000:0000 16.
我是这样看的:
10/32 = // input
10/2^5 = // convert division by power of 2 to bitshift
1010b >> 5 =
.01010b // fractional result
--^-------------------------------------------------------------
|
first nonzero bit is the exponent position and start of mantissa
----------------------------------------------------------------
man = (1)010b // first one is implicit
exp = -2 + 127 = 125 // position from decimal point + bias
sign = 0 // non negative
----------------------------------------------------------------
0 01111101 01000000000000000000000 b
^ ^ ^
| | mantissa + zero padding
| exp
sign
----------------------------------------------------------------
0011 1110 1010 0000 0000 0000 0000 0000 b
3 E A 0 0 0 0 0 h
----------------------------------------------------------------
3EA00000h
是的,Eric Postpischil 的回答是相同的方法(顺便说一句 +1),但我不喜欢这种格式,因为如果不正确阅读文本,乍一看并不清楚该怎么做。