将数字转换为 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),但我不喜欢这种格式,因为如果不正确阅读文本,乍一看并不清楚该怎么做。