浮点数加、减运算步骤

一、浮点数介绍

1.1 浮点数格式:

精度位数格式
单精度 float4个字节32位符号位1位,阶码8位,尾数23位
双精度 double8个字节64位符号位1位,阶码11位,尾数52位

1.2 浮点的表示方法
浮点数在机器中的形式如下所示,采用这种数据格式的机器称为浮点机
在这里插入图片描述
浮点数由阶码j和尾数S两部分组成,阶码是整数,阶符和阶码的位数m合起来反应浮点数的表述范围及小数点的实际位置;尾数是小数,其位数n反映了浮点数的精度,数符表示浮点数的正负。

1.3 浮点数表示范围

设浮点数阶码的数值位取m位,尾数是我数值位取n位,当浮点数为非规格化数时,它在数轴上的表示范围如下所示
在这里插入图片描述
当浮点数阶码大于最大阶码时称为上溢,此时机器停止运算,进行中断移出处理,当浮点数阶码小于最小阶码时,称为下溢,此时溢出的数绝对值很小,通常将尾数各位强制置零,按机器零处理,此时机器可以继续运行。

1.4 浮点数的规格化

为了提高浮点数的精度,其尾数必须为规格化数,如果不是规格化数,就需要通过修改阶码并同时左右移位数的方法,使其变成规格化数。将非规格化数转化成规格化数的过程称为规格化。

IEEE 754浮点数的尾数总是规格化的,其范围为1.000…0 × 2e~ 1.111…1 × 2 e ,e为指数。
规格化浮点数的最高位总是1,规格化使尾数的所有位都是有效的,因而尾数精度更高。
如:0.10… × 2 e规 格 化 为 1.10… × 2 e-1
10.1… 2 e 规 格 化 为 1.01… × 2 e+1
尾数规格化充分利用了可用的最大精度。如,一个8位非规格话的尾数0.0000101只有4位有效位,而规格化后的8位尾数1.0100011则有8位有效位。

二、浮点数转换二进制

不论是float还是double在存储方式上都是遵从IEEE的规范(IEEE floating point standard)的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。IEEE 标准如下:
在这里插入图片描述
在这里插入图片描述
举例:123.125(10) 分开 “整数” 和 “小数” 两部分来转二进制

123(10)转二进制是:0111 1011(2)
0.125(10)转二进制是:011(2)
0.125 * 2 = 0.25------0
0.25 * 2 = 0.5----------0
0.5 * 2 = 1.0-------------1
(具体转化规则不做详细解释)

根据上面两段生成的是:111 1011.001(2)
用科学记数法表示:1.111011001 * 2^6

不要 1. 剩下的111011001就是尾数(M),
为什么不要1. 呢?是因为1. 是肯定会有的,所以直接被省略了,取数时候会自动加上1. 来计算

指数(E)=6+127 = 133(10) = 1000 0101(2)
6就是1.111011001 * 2^6 的 6
127由来:因为float的指数(E)是8位,所以根据2^(8-1) - 1 = 127

为什么要指数(E)是6+127呢?
因为指数可能有负数即6也有可能是-6,所以要加上一个数,方便计算,而加上的这个数是根据float和double约定好的固定值。( double的指数(E)是11位,所以如果是double,就要将127改为2^(11-1) - 1 = 1023 )

符号(S):正数 = 0,负数 = 1
所以123.125 = 0 10000101 1110110010000000000000

三、浮点数运算步骤

3.1 浮点数的加减运算的五个步骤:对阶、尾数运算、规格化、舍入(要求使用对偶舍入)(0舍1入)、溢出判断。

  1. 类型提升和对齐:如果两个参与运算的浮点数类型不同,例如一个是float类型,另一个是double类型,那么float类型的数值通常会首先被提升(类型转换)为double类型,这个过程称为类型提升。提升之后的两个数的指数(Exponent)部分需要对齐,即保证它们有相同的指数。

  2. 对阶:要实现加减运算,比较小的数的尾数(Mantissa)会根据指数的差异进行右移,直到两个数的阶码相同。在右移的过程中,可能会有精度损失。

  3. 尾数运算:当指数对齐后,尾数进行加减运算。对于加法,相同位上的尾数值相加;对于减法,相减。

  4. 规格化:加减运算后的结果可能不是规格化的浮点数,所以接下来需要进行规格化处理。这意味着尾数可能需要左移或右移,同时调整指数值,确保尾数的最高有效位(通常)为1。

  5. 舍入处理:浮点数的位数是有限的,所以在规格化的过程中,尾数可能需要被截断,这就需要根据选定的舍入模式(如向最近偶数舍入、向下舍入等)来处理这些多余的位。

  6. 溢出判断:计算结果可能超出浮点数的表示范围,这可能导致溢出(overflow)或者下溢(underflow)。根据IEEE 754标准,溢出可能会导致得到无穷大表示,而下溢可能导致得到最接近零的数(丢失精度),或者产生特殊的非规格化数(subnormal numbers)。

3.2 计算实例

由于IEEE标准下的浮点操作数已被表示为规格化形式,计算机在进行浮点加法时,为了对齐指数,计算机必须执行下面步骤:
第一步,找出指数较小的数
第二部,使两个数的指数相同
第三步,尾数相加
第四步,如果有必要,将结果规格化
以一个简单的8位尾数和一个未对齐的指数为例说明浮点运算,A = 1.0101001 × 24 , B=1.1001100×23,计算A+B
在这里插入图片描述
注意:
(1)因为IEEE754标准的32位单精度浮点数的指数与尾数位于位于同一个字中,所以在加法过程开始之前必须将它们分离开。
(2)如果两个指数的差大于p+1,p为尾数的位数,这里p=23,较小的数由于太小而无法影响较大的数,结果实际就等于较大的数。
(3)结果规格化时检查指数范围,以分别检测指数下溢或上溢。指数下溢会导致结果为0,而指数上溢出会造成错误。

3.3 舍入机制
浮点运算可能引起尾数位数的相加,需要保持尾数位数不变的方法。最简单的技术叫作截断。
比如将0.1101101截断为4位尾数的结果为0.1101。截断会产生诱导误差(即误差是由施加在数上的操作计算所引起的),诱导误差是偏差的,因为截断后的数总比截断数小。

舍入是一种更好的减少数的尾数的技术。如果舍弃的位的值大于剩余数的最低位的一半,将剩余数的最低位+1。
在这里插入图片描述
要找到中间值,先确定要保留的有效数字,找到要保留的有效数字最低位的下一位。如果这位是进制的一半,而且之后的位数都为 0,则这个值就是中间值。

舍入机制:
(1)最简单的舍入机制是截断或向0舍入。
(2)向最近的数舍入:选择距离该数最近的那个浮点数作为结果。
(3)向正或负无穷大舍入:选择正或负无穷大方向上最近的有效浮点数作为结果。
(4)向偶数舍入:当要舍入的数位于两个连续浮点数的正中时,IEEE舍入机制选择最低位为0的点(即向偶数舍入)

舍入到最近的偶数例子:
十进制的 1.2500,要保留到小数点后一位,下一位是 5,是进制的一半,后面位数都为 0,所以这个值就是中间值
二进制的 10.0110,要保留到小数点后两位,下一位是 1,是进制的一半,后面位数都为 0,所以这个值就是中间值
知道了舍入规则之后(舍弃的位的值大于剩余数的最低位的一半),
看几个具体的例子,以二进制为例,有效位数保留到小数点后两位(保留两位数的话,0.xx1是余数的最低位的一半)。
10.00_011,中间值为 10.00100,小于中间值,向下舍入为 10.00
10.00_110,中间值为 10.00100,大于中间值,向上舍入为 10.01
10.11_100,中间值为 10.11100,等于中间值,要保留的最低有效位 1 为奇数,向上舍入为 11.00
10.10_100,中间值为 10.10100,等于中间值,要保留的最低有效位 0 为偶数,向下舍入为 10.10

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

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

相关文章

C++数据结构与算法——链表

C第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更…

Linux初始相关配置

前言 在学完了Linux的相关基础命令后,在正式使用Linux系统之前,我觉得配置一些东西是很有意义的。 文章目录 前言1.权限配置,普通用户无法sudo提权2.vim配置3.vim其他操作4.动静态库5.gcc/g6.程序翻译的过程7.make/makefile8.cmake/CMakeLis…

【Unity3D小功能】Unity3D中设置Text行首不出现标点符号

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中会遇到Text的文本内容行首出现标点符号的情况&#xf…

《动手学深度学习(PyTorch版)》笔记4.8

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过。…

实战教程:使用Spring Boot和Vue.js开发社区团购管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

使用AnimeGAN2将照片动漫化--入门

使用AnimeGAN2将照片动漫化--入门 1. 环境准备2. 使用3. 总结 1. 环境准备 首先下载AnimeGAN2:https://github.com/TachibanaYoshino/AnimeGANv2.git 然后使用conda 创建一个python3.6的环境conda create -n pyt36 python3.6: 创建一个requirements.txt文件&am…

生信学院|02月02日《云端设计一体化平台—3DEXPERIENCE》

课程主题:云端设计一体化平台—3DEXPERIENCE 课程时间:2024年02月02日 14:00-14:30 主讲人:郭俊辰 生信科技 解决方案顾问 1、云产品发展趋势 2、3DExperience产品的介绍 3、3DExperience DEMO演示 请安装腾讯会议客户端或APP&#xff…

记一次无法ping通Cisco switch处理

网络小白,仅仅在工作中需要telnet到switch。奈何之前不知什么原因一直无法ping通该switch,很久只能使用串口连接来配置了。而今遇到了使用脚本telnet switch的场景,不得不再次面对这个问题。 首先还是使用串口来看switch是否拿到ip&#xff…

【蓝桥杯冲冲冲】进阶搜索 Anya and Cubes

蓝桥杯备赛 | 洛谷做题打卡day22 文章目录 蓝桥杯备赛 | 洛谷做题打卡day22Anya and Cubes题面翻译输入格式输出题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示题解代码我的一些话 Anya and Cubes …

LeetCode 54 螺旋矩阵

题目描述 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入&#x…

线程池的知识

线程池是由服务器预先创建的一组子线程,线程池中的线程数量应该和 CPU 数量差不多。线程池中的所 有子线程都运行着相同的代码。当有新的任务到来时,主线程将通过某种方式选择线程池中的某一个子 线程来为之服务。相比与动态的创建子线程,选…

【昕宝爸爸小模块】深入浅出详解之常见的语法糖

深入浅出详解之常见的语法糖 一、🟢关于语法糖的典型解析二、🟢如何解语法糖?2.1🟢糖块一、switch 支持 String 与枚举2.2📙糖块二、泛型2.3📝糖块三、自动装箱与拆箱2.4🍁糖块四、方法变长参数…

实战Vue.js与MySQL:爱心商城项目开发指南

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

【深入浅出SpringCloud原理及实战】「Netflix系列之Hystrix」针对于限流熔断组件Hystrix的回退降级实现方案和机制

针对于限流熔断组件Hystrix的回退降级实现方案和机制 依赖隔离依赖隔离之线程&线程池高延迟请求的例子 线程池的优势线程池的弊端线程池的开销线程池开销 信号量 依赖隔离 Hystrix通过使用『舱壁模式』(注:将船的底部划分成一个个的舱室,…

SpringBoot+BCrypt算法加密

BCrypt是一种密码哈希函数,BCrypt算法使用“盐”来加密密码,这是一种随机生成的字符串,可以在密码加密过程中使用,以确保每次加密结果都不同。盐的使用增强了安全性,因为攻击者需要花费更多的时间来破解密码。 下图为使用BCrypt算法后的的密码结果值: 下面讲一下注册登陆…

[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

AIGC专题:生成式AI(GenAI)赋能供应链之路

今天分享的是AIGC系列深度研究报告:《AIGC专题:生成式AI(GenAI)赋能供应链之路》。 (报告出品方:Gartner) 报告共计:46页 什么是生成式人工智能 ChatGPT:一种OpenAI服…

Mac删除自带的ABC输入法,简单快捷

一、下载PlistEdit Pro软件 二、终端执行 sudo open ~/Library/Preferences/com.apple.HIToolbox.plist 三、其中有一个数字下面的KeyboardLayout Name的value为“ABC”,这就是ABC输入法,点击上面的Delete按钮,删除整项ABC内容&#xff0c…

MySQL表的基本操作

目录 一、创建表的语法 二、表的物理存储类型 三、数据类型 3.1 文本类型类型: 3.2 数字类型: 3.3 时间\日期类型: 常用数据类型: 四、查看表 五、删除表 六、修改表的结构 八、数据库字典 九、表的约束 9.1 五类完整…

Unity 常见的图像压缩格式优缺点

在Unity中,将图像压缩至更小的大小,既可以加快加载速度,也可以减少内存的占用。根据不同的目标平台,Unity提供了以下几种常见的图像压缩格式: 1. RGBA Compressed: 是一种通过压缩的方式来存储RGBA(红色、…