欢迎光临
我们一直在努力

组成原理 03|浮点数与运算

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

第〇节 · 扫盲(一句人话)

浮点数就是计算机的"科学计数法"。类比:用 1.23 × 10⁵ 表示一个很大或很小的数时,5 叫阶码(决定小数点位置)、1.23 叫尾数(决定精度)。IEEE 754 就是把这两部分和符号位,按固定位数塞进 32 位或 64 位里。坑主要在三处:尾数藏着个"隐含的 1"、阶码 0 和全 1 有特殊含义、浮点"溢出"看的是阶码不是尾数。


一、为什么用"阶码 + 尾数"

浮点数 = 基数² × 阶码 × 尾数(基数通常取 2)。把数值范围(靠阶码)和表示精度(靠尾数)解耦,才能同时表示极大和极小的数。

  • 规格化:尾数的最高位(整数部分)固定为 1,这个 1 不存储,叫隐含位——省 1 位换来多 1 位精度。

  • 真值公式(规格化):(−1)ˢ × (1 + M) × 2ᴱ⁻偏置。

⚠️ 隐含位 1 不能忘!算完阶码一定要还原 1.M,否则数量级直接错(2022 年 −0.4375 题就是典型)。


二、IEEE 754 位域与真值公式

格式S阶码 E尾数 M偏置阶码真值
单精度(32 位) 1 8 23 127 E − 127
双精度(64 位) 1 11 52 1023 E − 1023
  • 有效位(含隐含位):单精度 24 位、双精度 53 位。

  • 真值(规格化):(−1)ˢ × (1 + M) × 2ᴱ⁻偏置。


三、阶码的特殊取值(必背)

E 的取值含义
E=0 且 M=0 ±0
E=0 且 M≠0 非规格化数(无隐含 1,阶取 1−偏置,平滑下溢)
1 ≤ E ≤ 254(单) 规格化数
E=全 1 且 M=0 ±∞
E=全 1 且 M≠0 NaN(非数)

范围(单精度):

  • 最大规格化正数 = (2 − 2⁻²³) × 2¹²⁷ = 2¹²⁸ − 2¹⁰⁴

  • 最小规格化正数 = 1.0 × 2⁻¹²⁶

⚠️ 阶码全 0 时不是阶码 −127 的规格化数,而是非规格化(阶取 −126、无隐含 1)。如 2023 年 80200000H。


—— IEEE 754 位域拆分与阶码特殊取值

四、真题手算(一):真值 → 机器数

【408 真题 2011(13)】 float x = −8.25,FR1 内容是?

  • −8.25 = −1000.01B = −1.00001 × 2³。

  • S=1;E−127=3 → E=130=1000 0010B;尾数隐含 1,尾数位写 0000100…0。

  • 整体 1100 0001 0000 0100 0000…0 = C1040000H。

  • 答案:A(易误选 D——漏了隐含位)。

【408 真题 2022(14)】 −0.4375 的单精度表示?

  • −0.4375 = −0.0111B = −1.11 × 2⁻²。

  • E−127 = −2 → E=125=0111 1101B;尾数 1100…0。

  • 整体 1 0111 1101 1100…0 = BDC0 0000H。


五、真题手算(二):机器数 → 真值

【408 真题 2023(14)】 x 机器数 8020 0000H,值?

  • 8020 0000H = 1000 0000 0010 0000…0B。S=1(负);E=00000000(=0),M≠0 → 非规格化,阶取 −126、无隐含 1。

  • 真值 = −0.01 × 2⁻¹²⁶ = −2⁻¹²⁸。答案:A。

【408 真题 2018(14)】 单精度最小规格化正数?

  • S=0;E 取最小 1(真值 1−127=−126);M 全 0 → 1.0 × 2⁻¹²⁶。答案:A。

【408 真题 2012(14)】 单精度能表示的最大正整数?

  • 1.111…1 × 2²⁵⁴⁻¹²⁷ = 2¹²⁷ × (2 − 2⁻²³) = 2¹²⁸ − 2¹⁰⁴。答案:D。

【408 真题 2025(13)】 x 机器数 4730 0000H,值?

  • 0100 0111 0011 0000…0B。S=0;E=1000 1110=142,真值 15;M=011…0 → 1 + 0.25 + 0.125 = 1.375。

  • 值 = 1.375 × 2¹⁵。答案:D。


六、真题手算(三):精确表示与多类型解读

【408 真题 2021(14)】 不能用 IEEE 754 精确表示的是?

  • 1.25=1.01×2⁰、2.0=1.0×2¹、2.5=1.01×2¹ 都可精确;1.2 二进制无限循环(1.001100110011…),无法精确表示。答案:A。

【408 真题 2020(13)】 x 机器数 C800 0000H,x 可能是?

  • 若按 int(补码):符号位 1,取反加 1 得 −939524096。

  • 若按 float:S=1、E=10010000=144(真值 17)、M=0 → −1.0×2¹⁷ = −131072。

  • 同一串二进制,两种类型解读出两个合法值。答案:A。


七、浮点数加减运算:五步法

对阶 → 尾数加减 → 规格化 → 舍入 → 判溢出
│       │         │       │       │
小阶对大阶 补码/原码 左/右规 就近舍入 阶码超范围
尾数右移     求和     末位补1 (0舍1入) 则溢出

  • 对阶:小阶向大阶对齐,尾数右移(阶码每 +1,尾数右移 1 位)。对阶不引起阶码上/下溢。

  • 尾数加减:对齐后尾数相加减。

  • 规格化:左规(尾数左移、阶码−1,可能下溢);右规(尾数右移、阶码+1,可能上溢)。

  • 舍入:右规/舍入可能使阶码再 +1,故可能上溢。

  • 判溢出:看阶码是否超出范围。


  •  —— 浮点加减五步法流程

    八、真题手算(四):浮点加减

    【408 真题 2009(13)】 X=2⁷×29/32、Y=2⁵×5/8,X+Y 结果?

    • 对阶后 Y 尾数右移,与 X 尾数相加需右规;右规后阶码符号位 01 → 阶码上溢(阶码 8 超 5 位补码最大 7)。答案:D(溢出)。

    【408 真题 2015(14)】 关于浮点加减,正确的是?

    • Ⅰ 对阶不引起阶码上/下溢 ✓;Ⅱ 右规和舍入都可能上溢 ✓;Ⅲ 左规可能下溢 ✓;Ⅳ 尾数溢出仅误差、结果未必溢出 ✓。答案:D(全对)。


    九、溢出的判据:看阶码,不看尾数

    ⚠️ 浮点"溢出"看阶码、不看过大的尾数。尾数溢出只产生误差,结果不一定溢出。对阶、左规、右规、舍入每一步都可能改阶码,右规和舍入都可能把阶码推到上溢。


    十、运算电路:加法器 / ALU / 乘法器

    部件特点
    半加器 无进位输入,输出和 S、进位 C
    全加器 含低位进位 Cᵢ,输出 Sᵢ、Cᵢ₊₁
    串行进位加法器 进位逐位传,慢
    超前进位加法器 进位并行生成,快
    ALU 受操作码控制,完成加/减/与/或/异或;减法 = 加 + 取反 + 进位 1
    阵列乘法器 纯硬件并行,一周期完成乘法(面积大)
    串行乘法器 ALU+移位器循环,多周期(省面积)

    ⚠️ 无硬件乘法器时,编译器可把 a*b 编译成循环移位加法(Booth / shift-and-add)——所以"两个变量乘法无法编译为移位加法"是错的。


    十一、真题手算(五):运算电路

    【408 真题 2024(15)】 关于整数乘法,错误的是?

    • A 阵列乘法器可一周期完成 ✓;B ALU+移位器实现需多周期 ✓;C x*10 可编译为 (x<<3)+(x<<1) ✓;D "两个变量乘无法编译为移位加法" 错。答案:D。


    十二、类型转换(int / float / double)

    • int → float:可能丢精度(float 仅 24 位有效位,超则舍入,值可能变)。

    • float → int:截断小数。

    • float → double → float:精度无损,值不变。

    【408 真题 2010(14)】 下列关系表达式"真"的是?

    • I i==(int)(float)i:785 往返不变 ✓;II f==(float)(int)f:1567.8 截断为 1567 再转 float ≠ 原值 ✗;III f==(float)(double)f:无损 ✓;IV (d+f)−d==f:d 极大,+f 被舍入,结果≈0≠f ✗。答案:B(仅 I 和 III)。


    十三、易错点红黑榜

    易混 A易混 B关键区别
    隐含位 1 尾数存储 规格化尾数整数位 1 不存,算完要还原
    非规格化数 规格化数 阶码全 0、无隐含 1、阶取 −126
    浮点溢出 尾数溢出 浮点溢出看阶码;尾数溢出仅误差
    右规/舍入 上溢 右规和舍入都可能推高阶码到上溢
    阵列乘法器 串行乘法器 阵列一周期完成;串行多周期
    int→float→int 值不变 float 有效位 24,超限丢精度

    十四、速查表(文末收藏版)

    名称公式 / 结论
    单精度位域 S(1) + E(8) + M(23),偏置 127
    双精度位域 S(1) + E(11) + M(52),偏置 1023
    规格化真值 (−1)ˢ × (1+M) × 2ᴱ⁻偏置
    单精度最大正数 2¹²⁸ − 2¹⁰⁴
    单精度最小规格化正数 1.0 × 2⁻¹²⁶
    非规格化数 阶码 0、M≠0,阶取 −126、无隐含 1
    浮点加减 对阶→尾数加减→规格化→舍入→判溢出
    溢出判据 看阶码是否超范围(尾数溢出≠结果溢出)
    超前进位加法器 并行生进位,快于串行进位
    阵列乘法器 一周期完成乘法,面积大
    int→float 可能丢精度;float→double→float 无损

    下一篇 组成原理 04|主存与 Cache 转战存储器——这是组成原理分值最高、综合题最频繁的一章,Cache 映射和平均访问时间是必拿分。

    赞(0)
    未经允许不得转载:171主机测评 » 组成原理 03|浮点数与运算
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址