浮点数运算

article/2025/9/9 21:43:43

      今天学习了浮点数运算(加减乘除)。浮点数运算主要包括两部分:指数运算和尾数运算。在IEEE754标准下,指数运算就是阶码的运算,类似于无符号数运算。尾数运算是原码运算。之前一直很疑惑为什么前面的教材在介绍原码运算(加减乘除)所举的例子都是小数运算。现在猜想那部分内容可能只是为了浮点数运算做铺垫,这里才是主要的内容。(当然知识是不分重点的,但考试分)。下面就来详细介绍下浮点数运算的过程吧!另外本文使用的浮点数标准均为IEEE754结构,即单精度数由1位符号位,8位指数位,23位尾数位共计32位组成。

一、浮点数的加减运算:

       浮点数的加减运算分为5个步骤:对阶、尾数相加、尾数规格化、尾数舍入处理、溢出判断处理。下面详细介绍:

1. 对阶:

      所谓对阶,就是让两个操作数阶数相同,以便进行加减。实现的方式是对较小数的尾数进行右移操作。对阶的原则是向高阶看齐。计算公式为:
在这里插入图片描述
      当结果大于0说明被加数(被减数)阶数高,则对加数(减数)进行移位对阶。小于0则反之改变被加数(被减数)。

2. 尾数加减:

      将两个操作数的尾数相加减。值得注意的是:在IEEE754标准中,对于规格化数来说在小数点前有一位隐藏位1,在加减过程中需要把它还原到尾数中。尾数加减的实质是原码的加减,对于原码加减的规则如下图所示:

在这里插入图片描述

3. 尾数规格化:

      加减完成的尾数形式未必满足IEEE754对于尾数的要求,即保留23位,小数点在第一个1之后。需要对尾数进行左规和右规,下面介绍一下左规和右规。

      左规:将尾数向左移,用于清除第一个1前面出现的0。左规伴随着阶码减少,在左规过程中要检测阶码是否发生下溢,即阶码达到最小值(0000 0000)。

      右规:将尾数向右移,用于两数相加后出现向高位进位的情况。因为两数相加最多进一位,所以右规最多一位。右规伴随着阶码的增加,在右规过程中要检测阶码是否发生上溢,即阶码达到最大值(1111 1111)。

4. 尾数的舍入处理:

      在对阶和右规的时候,最右边的数字会被移出。为了保证最后计算的精度,把这些数字在过程中保存,等到最后进行舍入。也就是我上文提到的附加位。有两个问题值得注意:

      1) 保留多少附加位合适?

      2)最终对附加位怎么进行舍入?

      在IEEE754中保留了保护位,舍入位,粘位三位作为附加位。同时对于IEEE754来说最后附加位的舍入,有如下规则:
在这里插入图片描述

5. 溢出判断:

      在浮点数中是以阶码的溢出与否来作为评判标准的。单精度溢出分为上溢(指数大于等于127)和下溢(指数小于等于-126)。

      插一句:“之前一直以为下溢的指数是-149,这个数字来源于-126再把所有的尾数向右移,当到达-149时刚刚好所有尾数全部为零,即表示零。这个误区在于没有正确的区分规格化数和非规格化数。对于规格化数而言,下溢就是-126,所以规格化数表示的最小值为1.00…乘2的-126次方,而0~0.111…乘2的-126次方就是非规格化数表示的范围。-149正是非规格化数表示的最小范围。这里贴一张图,更加便于理解。

在这里插入图片描述
      下面直接粘贴一个书上的实例,对以上过程进一步加深了解:
在这里插入图片描述

二、浮点数乘除运算:

      浮点数乘除和定点数乘除相同,在正式运算前会对操作数进行预处理。对于乘法如果有一个操作数为0则结果为0。对于浮点数除法,若被除数为0,则结果为0。除数为0分两种情况,第一种是被除数非零,第二种是被除数为0。下面着重介绍一下两种除数为0:
      除数为0,被除数不为0:
         结果为无穷大。在IEEE 754标准下就是阶码全为1,尾数全为0。C语言输出如下图:
在这里插入图片描述
      除数为0,被除数为0:
         结果是NAN(not a number)。在IEEE 754标准下就是阶码全为1,尾数非0。在C语言中输出如下图:
在这里插入图片描述
      注:在Windows系统下,-1.#IND00即代表nan,Linux系统下会输出nan。

      下面详细介绍无特殊情况浮点数的乘除运算:

      浮点数乘除运算公式如下图:
在这里插入图片描述

   1.浮点数的乘法:

         点数的乘法运算主要分为四步:尾数相乘指数相加、尾数规格化、尾数舍入处理、溢出处理判断。

       1)尾数相乘,指数相加:

         尾数相乘即为原码相乘,这个具体的过程请参考另一篇文章:定点数运算(于文末给出网址)值得注意的是,对于规格化浮点数要记得恢复隐藏位。指数相加可以直接运用移码的计算方法:

      2)尾数规格化:

         对于两个操作数的尾数一定都是大于1的(隐藏位导致),所以最终得到的结果,小数点前会有两位共三种情况(01,11,10)。若为01则不需规格化,11和10则需右规一位。注意对于IEEE754标准浮点数乘法不需要左规。

      3)尾数舍入处理:

         两个小数相乘,尾数自然更多,但位置是有限的,需要对尾数进行舍入,具体的舍入规则参照浮点数加减的舍入规则即可。

      4)溢出处理判断:

         乘法的溢出有两种可能:阶码相加减时,以及尾数右规时。右规与上文相同,下面介绍一下阶码溢出的判断标准:
在这里插入图片描述
      注:Eb是最终的结果,EX和EY是操作数的指数值。

   2.浮点数除法:

      浮点数除法大致分为4步:尾数相除阶相减、尾数规格化、尾数舍入、溢出判断处理。由于除法大部分与乘法相似,所以此处只列出不同部分。

     在尾数相除阶相减过程中,尾数除法也在上文引用那篇文章中有具体介绍。阶码相减的运算公式如下:
在这里插入图片描述
      在尾数规格化步骤中:当除法运算完成后,若小数点前为0,则需进行左规以保证小数点前具有隐藏位1。

      对于除法阶码溢出判断的规则如下:
在这里插入图片描述
      注:Eb为最终结果指数,EXEY为操作数指数。

补充:在《程序是怎样跑起来的?》书中,对于阶码为什么使用0-127做了一个原因的解释:在计算机中,使用EXCESS系统的方法来同时存储正数和负数。这里面的0-127就是增加幻数之后的数字。幻数选择了127,可记为Excess_127。

本篇文章对于浮点数运算进行了介绍,因为作者水平有限,可能某些地方理解错误,请高手不吝赐教,批评指正,谢谢!


http://chatgpt.dhexx.cn/article/gV51Ogex.shtml

相关文章

计算机组成原理:浮点数的加、减、乘、除运算(含实例完整运算)

目录 浮点数的加减运算 零操作数的判断 对阶操作 尾数的加减操作 尾数的规格化 结果的舍入处理 结果的溢出判断 加减实例运算过程 浮点数的乘除法 零操作数的检查 阶码的加减操作 尾数的乘除操作 结果的规格化、舍入处理及溢出的判断 具体的操作如下图 乘除实例运算…

浮点数的运算方法

浮点数的运算方法 一、浮点数的表示1.浮点数的表示2.IEEE 754标准3.浮点数类型 二、浮点数的加减法1.定义2.运算步骤 三、运算部件四、强化练习 一、浮点数的表示 1.浮点数的表示 Ms表示尾数的符号位,E中1bit保存阶码的符号位其余空间存放阶码值,M中存放…

typeScript 接口(interface)及其与类型别名(type)的区别

背景 最近自己在学习一些视频剪辑相关的工具,像爱剪辑,剪映这些软件。然后就想自己是不是也可以实现一个类似的,轻量级的在线剪辑工具。最后发现这个款node端的工具库FFCreator,接下来简单介绍一下如何来搭建开发环境&#xff0c…

Type Description : This type is a general type that can be used to declare

错误描述: Complex type: param-valueType Description : This type is a general type that can be used to declare parameter/value lists. 解决方法: 把0移到init-param下面

Type and Value

Type and Value 前言一、reflect.Type1.1 数据结构1.2 方法1.2.1 所有类型通用方法1.2.2 不同基础类型的专有方法 二、reflect.Value总结参考资料 前言 reflect.Type和reflect.Value是go 反射的两大基本类型,一个管变量的类型方面,一个管变量的值方面。…

typescript interface 与 type 声明类型的区别

在 typescript 中, 我们定义类型有两种方式: 接口(interface) 和类型别名(type alias) 在官方文档中我们可以看到: Unlike an interface declaration, which always introduces a named object type, a type alias declaration can introduce a name for any kind…

type是什么

作者:newis 链接:https://www.zhihu.com/question/376890141/answer/1302417252 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 程语言的Type的话,有在不同的场景下有不同的意义…

Type-C

一、Type-C 从USB TYPE-C 的Spec上截一个USB TYPE-C母座的pin脚图: 可以看出,母座上有24根信号, 其中电源和地占据了8根,用于提升电流传输能力,剩下16个: (1)传输USB3数据的RXx和…

Java Type

Type 是Java 编程语言中所有类型的公共高级接口(官方解释),也就是Java 中所有类型的”爹“。其中”所有类型“的描述尤为指的关注。它并不是我们平常工作中经常使用的int、String、List、Map等数据类型,而是从Java语言角度磊说&am…

常见USB接口总结:Type-A、Mini-USB、Micro-USB、Type-C等等

写在前面 最近在整理之前的笔记,打算把一些有价值的笔记发到CSDN分享一下。这篇总结参考的链接如下,结合了自己找的一些图片,非原创,侵权的话私聊我删除。 参考文章链接 https://mb.zol.com.cn/514/5147157.html 总览 标准Type-…

# USB Type-A、Type-B、Type-C及MicroUSB、MiniUSB接口定义

USB Type-A、Type-B、Type-C及MicroUSB、MiniUSB接口定义 文章目录 USB Type-A、Type-B、Type-C及MicroUSB、MiniUSB接口定义1 USB Type-A(USB-A)2 USB Type-B(USB-B)3 USB Type-C(USB-C)3.1 24Pin3.2 16Pi…

Java FileReader相对路径

实验一快要到DDL了,今天在用Javac和Java命令手动执行实验一的代码的时候发现一个问题,当时在IDEA中运行正常的代码,在javac编译手动用java执行的时候发现并不能通过,出问题的代码是一段(试图)使用相对路径来…

详解HTML的相对路径写法,详解URL相对路径的写法

虽然现在搭网站都会用各种框架,路径方面使用相对路径可能已经比较少了,不过还是总结一下吧。 假设D盘这个路径下有一些文件: D:\例子\html\images\ D:\例子\html\style\ D:\例子\html\example.html D:\例子\html\tupian.gif 1.若引用的资源和…

Python读取相对路径文件

例如下图目录结构: 第一种情况: 1)xxx.py想要打开a.txt,使用相对路径,有如下两种方式: 思路: xxx.py想打开的是b_file下的文件,XXX.py和b_file都在文件目录之下,两者是同级目录,因此操作就是在当前目录向下搜索,因此就可以很容易理解下面的意思了 特别提示:… \是错…

html 的相对路径和绝对路径

整篇文章是以 src 标签进行演示。 文章目录 一、相对路径 1、同级目录查找 2、上一级目录查找 3、下一级目录查找 二、绝对路径 一、相对路径 👵相对路径:从当前所处的目录开始查找。 1、同级目录查找 写法: 1.1.直接写文件名&#xf…

java web项目 相对路径怎么写_理解JavaWeb项目中的路径问题——相对路径与绝对路径...

背景:html 在刚开始学习javaweb,使用servlet和jsp开发web项目的过程当中,一直有一个问题困扰着我:servlet 和 jsp 之间相互跳转,跳转的路径应该如何书写,才能正确的访问到相应的servlet或jsp文件?后来,在课堂上,通过老师的讲解,再加上本身的一些思考和实验,终于对we…

相对路径 各种情况

1.相对路径概念 1.1 相对路径就是相对于目标文件或(相对虚拟目录)的位置。,请看上图,“a.html” 文件里引用了“b.jpg”图片,由于“b.jpg”图片相对于“a.html”来说,是在同一个目录的,那么要在“a.html”文…

java中相对路径怎么写_java中如何使用相对路径读取文件

java中使用相对路径读取文件的方法:1、使用文件【File file = new File(“src/test.txt”)】方法;2、使用类的相对路径;3、使用当前线程的类加载器;4、读取web工程下的文件。 【相关学习推荐: java中使用相对路径读取文件的方法: 一、简单粗暴的 File file = new File(“…

linux 相对路径当前目录,Linux绝对路径和相对路径

前言 在使用linux远程连接操作文件时,我们就会遇到一个问题就是我们必须知道文件的存放位置,才能准确的找到文件并操作文件,在这里指明文件地址就有两种方式,那就是绝对路径和相对路径。 Linux文件目录 我们知道,Linux 系统中所有的文件(目录)都被组织成以根目录“/”开始…

golang 文件操作时相对路径问题

用os包进行Open,Create等操作的时候,需要传入一个path。 这个path 可以是绝对路径, 也可以是相对路径。 这里主要说一下相对路径的坑,在goland的里 // ./是你当前的工程目录,并不是该go文件所对应的目录。 // 比如myPro…