RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 970146
Accepted
eanmos
eanmos
Asked:2020-04-16 12:45:27 +0000 UTC2020-04-16 12:45:27 +0000 UTC 2020-04-16 12:45:27 +0000 UTC

如何理解和解决浮点数归一化的任务?

  • 772

在附录 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

那么正确答案是什么?如何正确解决这个任务?

математика
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    extrn
    2020-04-16T20:24:03Z2020-04-16T20:24:03Z

    我不会从评论中复制答案,而是写一点IEEE 754上面的数字将如何表示(双精度)

    0.0820465087890625

    在二进制表示中,没有任何额外的编码,这个数字看起来像这样:

    0.0001010100000001 2

    什么对应于规范化形式

    1.010100000001 2 × 2 -4

    类型double包含这样的位域

    1 бит   - Знак
    11 бит  - Порядок (со смещением 1023)
    52 бита - Мантисса (дробная ee часть)
    

    尾数的整数部分不会写入内存,事实是IEEE 754(几乎)中的数字总是以标准化形式写入,这意味着在点之前隐含一个单位。

    我们总共得到:

    签名:0 2

    订单:-4 + 1023 = 01111111011 2

    尾数:0101000000010000000000000000000000000000000000000000 2

    例如,您可以在python

    import struct
    
    value = 0b0_01111111011_0101000000010000000000000000000000000000000000000000
    
    print(struct.unpack('d', struct.pack('q', value))) # (0.0820465087890625,)
    

    因此,与您的解决方案的唯一区别是订单少了一个。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5