我了解如何将十进制数转换为 IEE 754。但我对如何回答这个问题感到困惑 - 它只给我一个商?我不被允许使用计算器,所以我不确定如何计算。我应该先将它们都转换为二进制并除以它们吗?
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。然后可以轻松读取十六进制: 3EA0000016。
我是这样看的:
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/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(获得它的另一种方法是在迭代 3 时 n 首次变为 >1,指数为 -3,如下所示1≤3/14*2^3<2).
我们可以用指数 = 127-3 = 124 和尾数 = 1.1011011011011 进行 IEEE754 编码....