计组学习笔记(一):浮点数的表示和运算

  最近学习计算机组成原理,遇到许多疑难问题,接下来写一写我在学习浮点数方面知识的理解,在巩固的同时也方便日后的复习。

一、浮点数的表示

1、浮点数的表示格式

  浮点数,顾名思义,就是小数点不固定的数。计算机中,根据小数点位置是否固定,分为两种数据格式,一种就是这个,小数点不固定,另一种是定点数,小数点是固定的。

  书上科学地对浮点数表示法的定义是,以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动。我们计算机的容量有限,不可能对每个数都用特别多的位数来表示,比如说2×10^99,这种非常大的数不可能用定点数来表示,所以呢利用浮点数就可以在位数有限的情况下扩大数的表示范围,同时能保持一定的有效精度。

  通常情况下,浮点数表示为:N = r^E × M

  式子里面r是浮点数阶码的底在计算机中是隐含的,通常情况下r=2。E和M都是带符号的定点数,E叫做阶码,M叫做尾数。其中E的大小越大,能表示的数范围越大,M的位数越大,数的有效精度越高。

  简单地举一个例子,1.111×2^100这里面1.111就是尾数,100就是阶码,显然这里阶码占的位数为3位,尾数占的位数是4位,假如阶码占的位数有4位,位数占的位数是3位(阶码和尾数所占位数总和不变),那么这个数就只能表示为1.11×2^0100,显然能表示的数的范围变大了,就这个例子来说原来尾数1.111转变为1.11损失了0.001,这就是精度的损失。

 浮点数的一般格式:


  这里J是阶符,表示阶码的符号,S是数符,表示浮点数的符号,阶符J和阶码的m位合起来表示浮点数的表示范围和小数点的实际位置,n位尾数反映了浮点数的精度。

2、浮点数的规格化

  为什么要进行浮点数的规格化呢,我们知道了浮点数的一般格式,同一个浮点数可以有很多表现形式,比如1.111×2^3,还可以表示为0.1111×2^4,还可以表示为11.11×2^2,那我们总不能任意地表示一个数吧,另外还有一个问题就是,如果尾数位数只有4位,我们想要表示同一个数1111采取两种方法,一个是 0.0111x2^5 和 0.1111×2^4(二者最高为是数符位S),我们可以很清晰地看到,如果采用阶码为5的方法,我们损失了一位精度,阶码为4的方法表示这个数更为精确。

  所以,为了提高运算精度,就要充分利用尾数的有效数位,也就是浮点数的规格化,即规定尾数的最高数位必须是一个有效值。非规格化数转变为规格化数,转变过程就是通过调整尾数和阶码的大小,使尾数最高位保证是一个有效值。通常有两种规格化操作:

  左规:当浮点数运算结果是非规格化数的时候,要进行规格化操作,将尾数算术左移一位,阶码减1(基数为2时),左规操作可能要进行多次。

  右规:当浮点数运算结果尾数出现溢出的时候,将尾数算术右移一位,阶码加1。需要右规操作的时候只需要操作一次。

  规格化浮点数的尾数M的绝对值应该满足这样的关系:1/r ≤ |M| ≤ 1(r就是我们的阶码的底,也是基数)。

  以r=2为例:

  1、原码尾数规格化后:正数为0.1xxxxxx形式,最大值为0.11......1;最小值为0.100......0。负数为1.1xxxxxx形式,最大值表示为1.10......0;最小值表示为1.11......1。

  2、补码尾数规格化后:正数同原码正数。负数为1.0xxxxxx形式,最大值表示为1.01......1;最小值表示为1.00......0。

  需要注意的是基数,刚刚是以基数为2时的规格化形式,补码规格化数的尾数最高位一定与尾数符号位相反。基数不同的时候,规格化的形式不同,当基数为4时,原码规格化形式的尾数最高两位不全为0;基数为8时,原码规格化形式的尾数最高三位不全为0。

  如何判断一个浮点数是否是规格化数:规格化浮点数的尾数小数点后的第一位一定是个非零的数。因此对于原码编码的尾数来说,只要看尾数的第一位是否为1就行;对于补码表示的尾数,只要看符号位和尾数最高位是否相反。(IEEE 754标准的浮点数尾数是用原码编码的)

3、IEEE 754标准

  IEEE 754标准采用的浮点数的格式:


  ms为数符,表示浮点数的符号,E为阶码部分,用移码表示,M是尾数部分,用原码表示。

  IEEE 754标准规定常用的浮点数格式有短浮点数(单精度、float)、长浮点数(双精度、double型)、临时浮点数。

  短浮点数数符占1位;阶码占8位,以2为底,用移码表示,阶码偏置值为127(阶码全1表示无限大,E的范围是1~254,空出全0表示非规格化数);尾数部分为23位。

  长浮点数数符占1位;阶码占11位,以2为底,用移码表示,阶码偏置值为1023(阶码全1表示无限大,E的范围是1~2046,空出全0表示非规格化数);尾数部分为52位。

  在IEEE754标准中长浮点数和短浮点数的尾数采用隐藏位策略的原码表示,什么意思呢。举个例子来说,以短浮点数为例,尾数占23位。我们知道,规格化浮点数后,尾数最高位一定是一位有效值,对于二进制浮点数来说,尾数最高位一定是1,那么我们为了充分利用资源,既然最高位一定是1了,我们干脆就把它隐藏好了,因此尾数实际上是24位,在表示的时候尾数23位是纯小数。比如说十进制12(1100),转化为二进制浮点数规格化后为1.1×2^3,这里我们就把整数部分的1 隐藏了,整数部分的1不存在23位尾数中,存的时候就是这样的32位:0   1000 0010   1000 0000 0000 0000 0000 000。

二、浮点数的加减运算

  浮点数运算的特点是阶码运算和尾数运算分开来算。加减运算一律采用补码。具体运算分为以下几步。

  1、对阶:对阶的目的是让两个数小数点的位置看齐,使这两个数的阶码相等。显然1.1×2^3和1.1×2^4是不能直接相加减的。原则是小阶向大阶看齐,像这个例子,就是1.1×2^3的尾数右移一位,阶码加一,直到两个数的阶码相等。

  2、尾数求和:阶码对齐之后就可以直接按照定点数的加减法则运算尾数了。

  3、规格化:尾数求和后的结果如果不是规格化数需要规格化,以双符号位运算为例的话,如果运算结果为正数,规格化的形式应该是00.1xxx......x,如果运算结果为负数,规格化后的形式应该是11.0xxx......x,不符合这种形式的数要进行左规或者右规的操作让其变成这种形式。(在尾数没有溢出的情况下,即尾数结果的双符号为不是10或01的时候,操作都是左规操作,左规操作可能不止进行一次,倘若双符号位为01或10则表明尾数已经溢出了,就要进行右规操作,右规只需要进行一次)

  4、舍入:在对阶和右规的操作中,我们都是将尾数右移,阶码加一,由于我们的位数是有限的,在右移的操作过程中很有可能就将低位的尾数丢失了,这会引起误差和精度问题。常用的减小误差的方法有“0”舍“1”入法:即在尾数右移时,被移去的最高数值位为0则舍去,如果被移去的最高数值位为1则在尾数末位加1,如果加1之后又产生溢出则再右规操作一次。恒置“1”法:看名字就可以知道,无论丢掉的最高数值位是1还是0,都使右移后的尾数末位置1。这种方法可能使尾数变大或者变小。

  5、溢出判断:既然定点数运算可能溢出,浮点数同样也会溢出,我们已经知道浮点数的表示方法和加减运算规则,既然是溢出,那么肯定是超出了浮点数能表示的范围,浮点数的范围主要是由阶码决定的,如果运算结果规格化后阶码产生了溢出,那才是浮点数的溢出。浮点数的溢出与否是由阶码的符号决定的。以双符号位的补码为例,如果阶码的符号位出现01或10则说明阶码溢出了,01表示阶码大于最大阶码,上溢,进入中断处理;10表示阶码小于最下阶码,下溢,按机器零处理。(溢出时真值的符号位和高位符号位保持一致)还要注意的一点是尾数之和(差)可能会造成尾数的溢出,这并不代表整个的溢出,需要右规一次看阶码是否溢出才能判断。


  以上便是我学习浮点数的时候结合书与自己的理解做出的总结,例子都是以基数为2时举的,如果有错误还望看出来的小伙伴勿责怪,帮忙指明一下下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

映世便携音箱我对你一见钟情啦~

映世便携音箱我对你一见钟情啦~我这个人平时不眼馋别人的东西,是你的就是你的,眼馋也没有用!但是……我第一次眼馋别人的东西居然是映世便携音箱!大姐,你那个东西给我好不啦~映世便携音箱,我爱死你啦~那天我…

Uniform String

版权声明&#xff1a;来自星空计算机团队(QQ群&#xff1a;134826825)——申屠志刚 https://blog.csdn.net/weixin_43272781/article/details/85105113 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_…

李天平:职场智慧之如何提升自己在公司的价值

一个人要想在公司立足&#xff0c;成为公司不可或缺的人才&#xff0c;并得到公司的重用和青睐&#xff0c;只有让自己对公司具有更大的价值&#xff0c;那么如何提升自己在公司的价值呢&#xff1f;1&#xff0e;任务分配&#xff0c;不怕累&#xff0c;多干活任何公司、老总都…

如何得到自增id值

如何得到自增id值 如何得到SqlServer的自增ID: SqlServer中的自增的ID的最后的值: SELECT SCOPE_IDENTITY() --返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。SELECT IDENTITY --返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值SELECT IDENT_CU…

Python 3 语法小记(一)入门 (print 函数用法总结)

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/jcjc918/article/details/9354815 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views…

如何查看linux的版本

虽然用过些版本的LINUX系统&#xff0c;但是没有查看过具体的版本是多少来着&#xff0c;下午心血来潮&#xff0c;想查看下自己的版本&#xff0c;到网上收索了下&#xff0c;看到有一大堆命令出来&#xff0c;呵呵&#xff0c;1 最简单的一个uname -a2 cat /etc/issue …

JDBC批量Insert深度优化(有事务)

JDBC批量Insert深度优化&#xff08;有事务&#xff09;环境&#xff1a;MySQL 5.1RedHat Linux AS 5JavaSE 1.5DbConnectionBroker 微型数据库连接池测试的方案&#xff1a;执行10万次Insert语句&#xff0c;使用不同方式。A组&#xff1a;静态SQL&#xff0c;自动提交&#x…

计算机专业面试中会问到的问题

今年是2015年&#xff0c;在过去几年中&#xff0c;电面&#xff08;电话面试&#xff09;是筛选程序员职位候选人的最流行的方式。它让雇佣双方很容易互相了解对方&#xff0c;候选人不需要去未来雇主的所在地&#xff0c;面试官也不用做额外的安排。这是我介绍程序员面试问题…

ActiveBpel部署运行BPEL流程实例

本文接收使用ActiveBpel开发&#xff0c;部署和运行BPEL流程实例。本文的例子工程和服务工程请见附件。1. 安装ActiveBpel5.0.2要安装ActiveBpel5.0.2&#xff0c;需要先安装JDK1.5&#xff0c;Tomcat。注意这里是JDK1.5版本的&#xff0c;ActiveBpel5.0.2不支持JDK1.5以上的版…

如何用c语言从txt文件中读取数据

用C语言从txt文件中读取数据&#xff0c;可以使用C标准库文件自带的文件接口函数进行操作。 一、打开文件&#xff1a; FILE *fopen(const char *filename, const char *mode); 因为txt文件为文本文件&#xff0c; 所以打开时选择的mode应为"r"或者"rt"。 …

活动目录实战系列五(更改域名)

在单域环境下且没有什么服务的情况的改域名还行&#xff0c;如果网络环境比较复杂或者有其他服务&#xff0c;不建议更改。以免发生错误。在实验中由于虚拟机坏掉在这里使用了两个&#xff0c;有部分图片对不上&#xff0c;请谅解。 WIN2000域不支持域重命名域重命名并不是在域…

关于C语言中的Bool类型变量的一点看法

C语言中并没有bool类型变量。这是C中新增的系统类型。 要在C语言中使用bool类型&#xff0c;可以使用自定义的方式。 使用整型做bool类型。 typedef int bool; 或 typedef unsigned char bool; 只要是整型&#xff0c;都可以当做bool使用。 使用枚举类型做bool类型。 typedef…

Lotus Notes Domino 监控

SUM服务器监控软件对Lotus可以进行全面监控. 监控方法主要采用SNMP(lnSNMP), 它是Lotus的标准监控方法. SUM用户不需要了任何Lotus MIB的信息, 只要启用lnSNMP服务即可实现对Lotus邮件, 文档, ,数据库,Demino, 线程等的监控. 主要监控内容:邮件: 总数,错误,正在传送等,邮件大小…

C语言中的fopen函数

fopen 函数原型&#xff1a;FILE * fopen(const char * path, const char * mode); 相关函数&#xff1a;open, fclose, fopen_s, _wfopen 返回值&#xff1a;文件顺利打开后&#xff0c;指向该流的文件指针就会被返回。如果文件打开失败则返回 NULL&#xff0c;并把错误代码存…

百度笔试

题目大致是这样的&#xff1a; 第一部分选择题&#xff1a;有几道网络相关的题目&#xff0c;巨简单&#xff0c;比如第一题是TCP、RIP、IP、FTP中哪个协议是传输层的......。有一道linux的chown使用题目。其他的全是数据结构的题目&#xff01;什么链&#xff0c;表&#xff0…

学IT,看教程,看视频,你必须知道的学习网站

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/rl529014/article/details/50570287 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_vie…

MFC消息响应机制及映射机制理解

一&#xff0e;MFC消息响应机制分析 ---- MFC是Windows下程序设计的最流行的一个类库&#xff0c;但是该类库比较庞杂&#xff0c;尤其是它的消息映射机制&#xff0c;更是涉及到很多低层的东西&#xff0c;我们在这里&#xff0c;对它的整个消息映射机制进行了系统的分析&…

KMP算法 Next数组详解(【洛谷3375】KMP字符串匹配 )

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq_30974369/article/details/74276186 </div><div id"content_views" class"markdown_views"><!-- flowchart 箭头图标 勿删 --…

“顾问”

关于顾问的定义&#xff0c;有这么一个故事&#xff1a;一个客户花了大价钱启动了一个项目&#xff0c;这个项目主要解决的问题是&#xff1a;“现在几点了&#xff1f;”这时顾问走过来说&#xff1a;“请借你的手表用一下。”然后看了一下说&#xff1a;“现在是下午3点。”然…

转自知乎-我见过最通俗易懂的KMP算法详解

有些算法&#xff0c;适合从它产生的动机&#xff0c;如何设计与解决问题这样正向地去介绍。但KMP算法真的不适合这样去学。最好的办法是先搞清楚它所用的数据结构是什么&#xff0c;再搞清楚怎么用&#xff0c;最后为什么的问题就会有恍然大悟的感觉。我试着从这个思路再介绍一…