在附录 B 的结构化计算机组织一书中有这样一个任务。浮点数:
4 . 以下二进制浮点数由符号位、超过 64、基数 2 指数和 16 位小数组成。标准化它们。
一个。
0 1000000 0001010100000001 0 0111111
0000001111111111 0 1000011 1000000000000000
我的决定
我这样理解这个任务:
我们有以下格式:1 个符号位,7 个指数位,偏移量为 64,尾数为 16 位。
我们需要标准化以这种格式表示的数字 0 1000000 0001010100000001。如果一个数的尾数的最左边为 1,则该数称为归一化。因此,我们需要将尾数的所有位向左移动 3 位。如果我们将一个数字向左移动三位,那么我们将它乘以 2³。因此,为了使数字不变,我们需要将指数减少 3。
如果将原数(0 1000000 0001010100000001)转化为十进制形式,那么我们得到:
+ 2^(64 - 64) × (2^(-4) + 2^(-6) + 2^(-8) + 2^(-16)) = +1 × 0.0820465087890625 = +0.0820465087890625
如果我们翻译相同的数字,由我标准化,(0 0111101 1010100000001000),我们得到:
+ 2^(61 - 64) × (2^(-1) + 2^(-3) + 2^(-5) + 2^(-13)) = +2^(-3) × 0.6563720703125 = 0.125 × 0.6563720703125 = +0.0820465087890625
也就是同一个号码。
作者的决定
在这里找到解决方案。据我了解,这些是发布者提供的官方答案。
4 . 为了标准化,一次左移 1 位,在每一步将指数加 1,直到分数的最左边为 1。结果是
(a) 0 1000011 1010100000001000
(b) 0 1000101 1111111111000000
(c) 0 1000011 1000000000000000第三个已经正常化了。
@avp 解决方案
由于我的回答和作者的回答有出入,决定在C、C++聊天中求助:
…我对这个例子的理解不同。给出符号 0 - 正数,指数为 1000000 == 0x40 == 64(即,考虑到偏移量 64,这是 0)和 16 位整数 0x1501 == 5377。就是这样,你需要转换它只是一小部分
@eanmos 一般来说,您对问题的看法可能更正确(从指数中减去 3)。在我的解释中,这个问题的提法看起来太自命不凡了。而我的解释中的答案(我在书中没有找到答案)将是 - 将 12 添加到指数(因为 5377 必须除以 4096 才能转换为分数),这显然与您要问的答案不符关于。
— @avp
那么正确答案是什么?如何正确解决这个任务?
我不会从评论中复制答案,而是写一点
IEEE 754上面的数字将如何表示(双精度)在二进制表示中,没有任何额外的编码,这个数字看起来像这样:
什么对应于规范化形式
类型
double包含这样的位域尾数的整数部分不会写入内存,事实是
IEEE 754(几乎)中的数字总是以标准化形式写入,这意味着在点之前隐含一个单位。我们总共得到:
例如,您可以在
python因此,与您的解决方案的唯一区别是订单少了一个。