前言: 上次学习汇编语言(清华大学 张悠慧)是在11月26日,内容是IEEE 754(浮点数表示)。当时撇下了一道题,等度过了12月(英语六级+本科阶段的最后考试+最后的大作业)再把汇编捡起来。现在正是把这个题目捡起来的时候。

11月26日的学习笔记:点击这里进入CSDN链接

2020年4月3日得到指正,重新修改此文。

题目

给定一个浮点格式(IEEE 754),有k位指数和n位小数,对于下列数,写出阶码E、尾数M、小数f和值V的公式。另外,请描述其位表示。

  • 数5.0;
  • 能够被准确描述的最大奇数;
  • 最小的正规格化数。

解决

前置知识一:IEEE 754

IEEE 754约定,计算机中浮点数二进制表示为:

数字形式:(−1)sM2E(-1)^s M 2^E(−1)sM2E

  • 符号:s
  • 尾数:M,是一个位于区间[1.0, 2.0)内的小数
  • 阶码:E

编码形式:

s exp frac

exp域:E(注意,E要进行变换,再存储在exp中);
frac域:M。

前置知识二:规格化浮点数(Normalized)

这里讨论到规格化浮点数(Normalized):

  • 满足条件:exp不全为0且不全为1。
  • 真实的阶码值需要减去一个偏置(biased)量:
    • E = Exp - Bias
    • Exp:exp域所表示的无符号数值
    • Bias的取值:
    • 单精度数:127(Exp:1…254,E:-126…127)
    • 双精度数:1023(Exp:1…2046,E:-1022…1023)
    • Bias = 2^{e-1} - 1,e = exp的域的位数
  • frac的第一位隐含1:M = 1.xxx…x_2
    • 因此第一位的“1”可以省去,xxx…x:bits of frac
    • Minimum when 000…0 (M = 1.0)
    • Maximum when 111…1 (M = 2.0 - \epsilon)
前置工作一:整理变量关系

Bias=2e−1−1Bias = 2^{e-1} - 1Bias=2e−1−1

E=exp−BiasE = exp - BiasE=exp−Bias

V=(−1)sM2EV = (-1)^s M 2^EV=(−1)sM2E

则E为dec(exp)−(2e−1)dec(exp) - (2^{e} - 1)dec(exp)−(2e−1)

E最大值为2e−1−1−(2e−1−1)=2e−1−12^e - 1 - 1 - (2^{e-1} - 1)= 2^{e-1} - 12e−1−1−(2e−1−1)=2e−1−1。(为什么不是2e−1−(2e−1−1)2^e - 1 - (2^{e-1} - 1)2e−1−(2e−1−1)呢?因为有规定:exp全部取1为“非规格化浮点数”,因此规格化浮点数中exp不能全部取1,顶多为(1)*(0)

E的最小值为1−(2e−1−1)=2−2e−11-(2^{e-1}-1)=2-2^{e-1}1−(2e−1−1)=2−2e−1。(为什么不是0−(2e−1−1)0-(2^{e-1}-1)0−(2e−1−1)呢?因为有规定:exp全部取0为“非规格化浮点数”,因此规格化浮点数中exp不能全部取0,顶多为(0)*(1)

前置工作二:总结特性

抛开例题,来看一个例子:

  • 8位浮点数表示:exp域宽度为4 bits,frac域宽度为3 bits。则,其偏置量的值为2^(4-1) - 1 = 7.
  • 其他规则符合IEEE 754规范。

取值范围如下表。

s exp frac E value
0 0000 000 -6 0
0 0000 001 -6 1/8 * 1/64 = 1/512
0 0000 010 -6 2/8 * 1/64 = 2/512
0 0000 110 -6 6/8 * 1/64 = 6/512
0 0000 111 -6 7/8 * 1/64 = 7/512
0 0001 000 -6 8/8 * 1/64 = 8/512
0 0001 001 -6 9/8 * 1/64 = 9/512
0 0110 110 -1 14/8 * 1/2 = 14/16
0 0110 111 -1 15/8 * 1/2 = 15/16
0 0111 000 0 8/8 * 1 = 1
0 0111 001 0 9/8 * 1 = 9/8
0 0111 010 0 10/8 * 1 = 10/8
0 1110 110 7 14/8 * 128 = 224
0 1110 111 7 15/8 * 128 = 240
0 1111 000 n/a inf

可以看出,假设frac有f位,则M可视为:

M={0+12f×C,if all(exp==0)1+12f×C,if both ’0’ and ’1’ in expn/a,if all(frac==1)M=\left\{ \begin{aligned} 0+\frac{1}{2^f} \times C &, \; & \text{if all(exp==0)} \\ 1+\frac{1}{2^f} \times C &, \; & \text{if both '0' and '1' in exp} \\ \text{n/a} &, \; & \text{if all(frac==1)} \\ \end{aligned} \right.M=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​0+2f1​×C1+2f1​×Cn/a​,,,​if all(exp==0)if both ’0’ and ’1’ in expif all(frac==1)​

其中,C是整数,由frac决定,即C=dec(frac)C=dec(\text{frac})C=dec(frac);

并且C满足0≤C≤2f−10 \le C \le 2^f - 10≤C≤2f−1。

则浮点数V的十进制即为:

V={(−1)s×22−2e−1×(0+12f×C),if all(exp==0)(−1)s×2[dec(exp)−(2e−1)]×(1+12f×C),if both ’0’ and ’1’ in exp(−1)sinf or n/a,if all(frac==1)V=\left\{ \begin{aligned} (-1)^s\times2^{2-2^{e-1}}\times(0+\frac{1}{2^f} \times C) &, \; & \text{if all(exp==0)} \\ (-1)^s\times2^{[dec(exp) - (2^{e} - 1)]}\times(1+\frac{1}{2^f} \times C) &, \; & \text{if both '0' and '1' in exp} \\ (-1)^s \; \text{inf or n/a} &, \; & \text{if all(frac==1)} \\ \end{aligned} \right.V=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​(−1)s×22−2e−1×(0+2f1​×C)(−1)s×2[dec(exp)−(2e−1)]×(1+2f1​×C)(−1)sinf or n/a​,,,​if all(exp==0)if both ’0’ and ’1’ in expif all(frac==1)​

dec(exp)−(2e−1)dec(exp) - (2^{e} - 1)dec(exp)−(2e−1)也可写作EEE:

V={(−1)s×22−2e−1×(0+12f×C),if all(exp==0)(−1)s×2E×(1+12f×C),if both ’0’ and ’1’ in exp(−1)sinf or n/a,if all(frac==1)V=\left\{ \begin{aligned} (-1)^s\times2^{2-2^{e-1}}\times(0+\frac{1}{2^f} \times C) &, \; & \text{if all(exp==0)} \\ (-1)^s\times2^{E}\times(1+\frac{1}{2^f} \times C) &, \; & \text{if both '0' and '1' in exp} \\ (-1)^s \; \text{inf or n/a} &, \; & \text{if all(frac==1)} \\ \end{aligned} \right.V=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​(−1)s×22−2e−1×(0+2f1​×C)(−1)s×2E×(1+2f1​×C)(−1)sinf or n/a​,,,​if all(exp==0)if both ’0’ and ’1’ in expif all(frac==1)​

其中,eee、fff分别为exp、frac位数,为常数。

解决问题一:数0.5

较为简单,直接解决如下。

0.5          // 转换为二进制 ==>
0.1         // 移动小数点,使其在最左边的1之后
M   = 1.0  // 小数点后的数字存储在frac中
E   = -1   // 因为是左移
frac= 0*   // 共n位
exp = E + Bias= -1 + (2^(e-1) - 1)

则,位的描述为:

s exp frac
0 bin(-1 + (2^(e-1) - 1)) 00…(共n位)
解决问题二:能够被准确描述的最大奇数

根据前置工作二,可以看出,对于规格化浮点数可化简为:

V=(−1)s×2E×(1+12f×C)=(−1)s×(2E+2E−f×C)\begin{aligned} V & = & (-1)^s\times2^{E}\times(1+\frac{1}{2^f} \times C) \\ & = & (-1)^s \times (2^{E}+2^{E-f} \times C) \end{aligned}V​==​(−1)s×2E×(1+2f1​×C)(−1)s×(2E+2E−f×C)​

现在的任务有两个:

  • 是整数,不能有小数(则EEE应大于等于fff);
  • 是奇数(2E2^E2E不是奇数,因此使2E−f×C2^{E-f} \times C2E−f×C为奇数,则2E−f2^{E-f}2E−f取1,则取E=fE=fE=f)。

下面分类讨论:

情况一:E可以取到f时,

即2e−1−1≥f2^{e-1} - 1 \ge f2e−1−1≥f时,

EEE取fff,CCC取其能取的最大奇数,对应的二进制为:
exp:dec2bin(f+(2e−1−1)f + (2^{e-1} - 1)f+(2e−1−1)),frac:1*(frac全为1)

情况二:E取不到f时,

这种情况不可能,因为E取不到f,则很多整数都不能表示。

解决问题三:最小的正规格化数

观察:

V=(−1)s×2E×(1+12f×C)=(−1)s×(2E+2E−f×C)\begin{aligned} V & = & (-1)^s\times2^{E}\times(1+\frac{1}{2^f} \times C) \\ & = & (-1)^s \times (2^{E}+2^{E-f} \times C) \end{aligned}V​==​(−1)s×2E×(1+2f1​×C)(−1)s×(2E+2E−f×C)​

则sss取000,EEE、CCC分别取最小。

由前置工作一,EEE取2−2e−12-2^{e-1}2−2e−1,CCC取000,对应的二进制为:
exp:0*1,frac:0*

总结

没有找到标准答案,特性与问题是我自己总结的。如果有错误与问题,欢迎通过piperliu@qq.com与我交流讨论。

另,12月确实太忙了,差点失去常规的学习状态,接下来可要复出咯!

【例题】给定一个浮点格式(IEEE 754),有k位指数和n位小数,对于下列数,写出阶码E、尾数M、小数f和值V的公式。另外,请描述其位表示。相关推荐

  1. 给定一个字符串,输出第一次出现k次的字母java,c++实现

    题目: 给定一个字符串,输出第一次出现k次的字母. 示例:    输入:abbcdaabgb               3    输出:a 输入:aaabbb               3     ...

  2. 认识32位浮点数(分别输出符号,阶码,尾数)

    按IEEE 754标准,32位浮点数的标准格式如下图所示. 例如,一个浮点数的二进制数格式为: 则该数的三个部分分解如下: 1)符号位:0 2)阶码部分:10000010 3)尾数部分:0110110 ...

  3. 二进制的科学计数法?白话谈谈计算机如何存储与理解小数:IEEE 754

    浮点数的计算机表示(IEEE 754),由 UCB 数学教授 William Kahan 主要起草.后者也因其卓越贡献于1989年获得图灵奖.计算机组成原理与汇编语言这两门课均对该内容有所讲解.与课程 ...

  4. 【汇编语言与计算机系统结构笔记03】浮点数的计算机表示,IEEE 754,舍入(rounding),C语言中的浮点数

    本次笔记内容: 04.浮点数的计算机表示 文章目录 IEEE的浮点数标准 IEEE的754标准 浮点数示例 计算机中浮点数二进制表示 浮点数的类型 规格化浮点数(Normalized) 规格化浮点数示 ...

  5. IEEE 754浮点数标准详解

    转载于:http://c.biancheng.net/view/314.html 在计算机系统的发展过程中,业界曾经提出过许多种实数的表达方法,比较典型的有相对于浮点数(Floating Point ...

  6. IEEE 754浮点数简介与C代码实现

    目录 构成 相关名称 历史 IEEE浮点数的表示形式 分类 标准浮点格式 大小端模式 代码实现 构成 浮点数表达法采用了科学计数法 来表达实数,记住一点即可:a至少为1即可: 一个有效数字.一个基数( ...

  7. Java入门之7:Java中的float和double类型的浮点数是怎么按照IEEE 754标准存储的?

    前言: 这篇博文,我写了好几天--,里面涉及的基础概念比较多,内容比较多,举例也比较多,想搞清楚明白就难免 我自己都会觉得啰嗦,我整理了目录出来,看完需要一点时间,可以自行根据需要.感兴趣的 选择阅读 ...

  8. IEEE 754浮点数工业标准

    文章目录 浮点数概述 浮点数的格式 IEEE 754标准规定的浮点数的格式 IEEE 754偏移量与指数范围问题 IEEE 754中浮点数值的三种情况: 1. 规格化的浮点数的值 2. 非规格化的值 ...

  9. 【编程基础】浮点数在计算机中的存储 —— IEEE 754标准

    寻求更好的阅读体验,请移步 :浮点数在计算机中的存储 -[Mculover666的个人博客]. 用于存储小数的数据类型是有单精度浮点型(float)和双精度浮点型(double),那么,浮点数在计算机 ...

最新文章

  1. Node.js包管理器Yarn的入门介绍与安装
  2. 微服务网关Gateway实现Host过滤
  3. VulnHub靶机系列:Os-ByteSec
  4. Java-杂项:Java数组Array和集合List、Set、Map
  5. IntelliJ IDEA如何 导入、导出 设置
  6. iOS多线程之GCD
  7. openharmony标准系统移植之适配hdc功能
  8. 面向Web开发人员和网站管理员的Web缓存指南
  9. 培训2022年6月22日
  10. CTFshow新春欢乐赛--web6--反序列化字符串逃逸
  11. ChatGPT 使用 拓展资料:使用 HuggingFace+Gradio 部署快速搭建一个ChatGPT的聊天界面
  12. 动态主机配置协议(DHCP)
  13. 英语口语275之每日十句口语
  14. 震惊:竟然有大神做出了地府后台管理系统!!!
  15. 畅购商城canal依赖(超级简单,不会你来kan我!!)
  16. C#人脸识别入门篇(Step by step 人脸识别)
  17. 牛客练习赛24-B-贪心
  18. 趋肤效应实验报告_无线电能传输(课程设计报告)实验报告
  19. 计算机改桌面存储地址,win7系统设置桌面存储的位置的处理技巧
  20. windows操作系统安全

热门文章

  1. 【Oracle】恢复重做日志组
  2. 【PL/SQL】异常处理
  3. linux ifcfg-33 没有eth0解决方法
  4. 关于System.FormatException异常
  5. 微信分享网页链接缩略图不显示解决方法
  6. 如果删除了DOM元素,是否还将其侦听器也从内存中删除了?
  7. linux 远程 mysql,linux下mysql远程访问
  8. SpringBoot整合RabbitMQ测试代码
  9. mybatis当输入参数有多个时的解决方案,Map类型,索引引用输入参数,map输出
  10. windows c语言 socket通信