浮点数——计算机组成原理笔记
浮点数——计算机组成原理笔记
一、浮点数简介
浮点数是计算机中的一个数值型数据;与之相对应的概念是定点数;本篇笔记建议配合《计算机组成原理——面向实践培养》食用~
首先我们来介绍原理性的浮点数格式
在这个图中,主要分为两部分,一个是包含阶符的阶码,另一个是包含数符的尾数;在二进制中,真值和浮点数的对应关系如下:
也就是,浮点数的值等于系数和一个指数的乘积,这个指数的幂就是阶码所表示的值,系数就是尾数所表示的值,这里相当于是一个科学计数法
在九年义务教育中我们知道,一个科学计数法可以写成很多种不同的形式,为了方便我们处理,我们会把它统一成一个形式,这个过程就叫做规范化,为了方便我们接下来介绍和理解浮点数,在这里告诉大家,这个式子中的M也就是尾数,是一个纯小数(绝对值小于等于1)
计算机中机器数的运算通常使用补码,所以有时候我们的浮点数的阶码和尾数会采用补码表示(还有用移码表示的,后面会介绍移码的计算方法)
经过了感性的认识,接下来我们将会举例说明一个浮点数和其真值之间的细节
二、一个浮点数实例
假设这里有一个浮点数,阶码使用补码表示,共8位,包含1位阶符;尾数也使用补码表示,同为8位,包含一位数符;下面,首先我们来探索这个浮点数的典型值,我们很容易想到有四种典型值:最小负数,最大正数,最小正数,最大负数;
首先我们来看最简单的情况,最大正数,要完整分析浮点数,我们应该了解这个浮点数的机器数表示和真值表示;回想一下我们所提到的科学计数法不难想到,想要得到最大正数,我们应该使阶码为最大的正直,且尾数为最大的正小数,(马上就会提到规范化问题)
首先我们来看阶码,阶码是用补码表示的,抛去最高的符号位,我们有7位用来表示“数值”(简单理解下)那么很容易想到,最大的数应该是7位全取1,第一位取0(原码),此时阶码的真值为 2^7 ,而我们的阶码是是用补码表示的,转换为补码之后仍为01111111(7个1)
紧接着是尾数,最大的尾数原码表示的话应该是0.1111111,转化成补码,仍然为0.1111111,也就是说,最大的正数结果如下:
(此式中n=7)上面说了,为了使结果唯一,我们要进行规范化,我把规范化相关的内容放在最后一张图片上了,这里规范化的结果就是上面的结果
最大负数:
思路和上面的一样,首先我们来看阶码,很容易想到阶码应该仍保持最大值,也就是2^n,现在我们来找,绝对值最大的、负的尾数,这里又涉及到原码补码的区别和联系,我们这个浮点数是使用补码来表示的,我们找的时候就应该找,我们所能表示的补码中,最小的负数,那么是不是我们可以先写出原码,然后转化成补码呢?在这里不可以,因为补码和原码所能表示的范围是不一样的,请牢记下图:
我们看到因为原码有两个零,所以表示原码能够表示的最小负数,比补码能表示的最小负数大,放到纯小数也一样,那么我们这里尾数的取值就很好理解了,他就是1.0···00;最后我们得到的结果为
最小正数
阶码需要取最小值,也就是负的绝对值最大的值,因为同样是使用补码表示,所以根据上面那个图,我们得到阶码为10000000;尾数为正的最小值,也就是0.0000001;转化成补码仍为0.0000001,但是,这个不满足规范化,请查看下面关于规范化的描述;所以我们得到的规范化的最小正尾数,应该是0.1000000(即1/2),最终结果为:
最大负数
最大负数就是绝对值最小的负数,通最小正数一样,阶码为10000000,现在我们寻找:绝对值最小的、负的,尾数,根据我们求最小正数时的思路,他应该是1.0000001的补码,但是这个值的真值并不满足规范化,查看规范化的要求之后我们发现,我们所求的尾数,应该是1.1000001,他的补码是1.0111111;
-
尾数的规范化:
在《计算机组成原理——面向实践培养》一书中有这样一句话:“若浮点数用补码表示,此时规格化尾数的符号位与最高有效位刚好相反”,那么为什么相反,实际上涉及到补码的知识,需要对补码有较为熟悉的了解才行,只知道概念是不够的
三、总结
本身寻找典型值不难,科学计数法大家也都好理解,比较令人感到陌生的是补码的,和补码的规范化形式;首先我们应该知道补码和原码所能表示的真值范围是不一样的,也就是绝对值最大的那个负值,第二个就是关于规范化,记住上面四种情况,对应着求就行了
四、IEEE754
我把书上的内容直接借鉴过来了,因为感觉比较好理解,也不需要额外强调什么点
--- 本篇到此结束,如果发现有不对的地方请及时指出,感谢🙇
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理