浮点数的表示和运算

news2024/9/21 11:04:13

文章目录

  • 浮点数的表示
    • 表示
    • 溢出
    • 规格化
    • IEEE754
      • 格式
      • 浮点数真值的计算公式
      • 范围
  • 浮点数的加减
  • 浮点数的乘除
  • 刷题小结

浮点数的表示

表示

为什么会有浮点数?位数有限的情况下,既扩大了数的范围,也保持了数的精度。

浮点数的意思是小数点是浮动的,阶码的值决定了小数点是怎么"浮动"的。

浮点数公式:

image-20230305115253964

浮点数组成

image-20230305120246234

image-20230305205218315

阶码由阶符和数位组成,阶符就是阶码的符号。0表示正,1表示负

数符就是尾数的符号。0表示正,1表示负

从这可以看出,这个定义太松散了,比如没有规定阶符几位,尾数数符几位等等,所以如果没有一个统一的标准去规定浮点数那浮点数在计算机中的存储就会多种多样,所以后面就有了IEEE754标准。

溢出

溢出的概念

image-20230305120955892

数轴上溢出的图示

image-20230305120348902

溢出时计算机的处理:上溢时直接中断处理溢出,下溢时直接当做机器数0

规格化

规格化:通过尾数移动和阶码变化来实现尾数最高数位为有效位。

举个例子,0.000011* 100D,其中尾数000011里的0000都不是有效数位,如果尾数直接存就是6位,所以可以移动尾数变成0.11*10-4,现在的尾数就是11了,我们存进去就只需要两位,在机器字长有限的情况下,规格化可以使得有效位数更多,进而使得精度更高

image-20230305121716355

左规可以简单理解为左移,左移一位,阶码减一

右规可以简单理解为右移,右移一位,阶码加一。可能损失精度

注意移动的是数不是小数点

规格化还与基数有关,以二进制为例,当基数为2时,则最高数位为有效数位。基数为4时,则最高的两位数位为有效数位。基数为8时,则最高的三位数位为有效数位。我的理解是基数为4时,两个二进制位才表示一个数,保证这个数是有效的即可。一般情况下默认基数为2,除非特别声明。

我们说的有效数位,可以理解为有意义,但是有效数位≠不为0,得考虑尾数是原码还是补码。原码时,有效数位就是1,所以让最高数位为1就是规格化。但如果是负数的补码时,0才是有效数位(补码按位取反+1后,最高数位的0会变成1)。

image-20230305123604057

IEEE754

IEEE754是一种浮点数标准,C语言里用的浮点数标准就是IEEE754.。

image-20230305134652942

格式

image-20230305194148090

可以看出主要分为32位精度和64位精度的,其中32位记住1,8,23,64位记住1,11,52。

以32位为例,符号位为0表示正,为1表示负。阶码一般由移码表示,偏置量是127(28-1-1)。尾数是23位,一般是原码表示(算的时候不用再取反了),尾数实际精度是24位,由于规格化的原因最高数位必为1,所以可直接隐藏掉1,所以看上去23位精度其实是24位。

单精度浮点数 - 维基百科)

浮点数真值的计算公式

image-20230305200007936

短浮点数指的就是32位的,长浮点数就是64位。其中E-127是因为阶码偏移值是127(28-1-1),64位的偏移值是211-1-1=1023,所以E-1023就能得到阶码的真值。

范围

32位浮点数移码的偏移量是127,一般移码的偏移量会定为128,所以这里会有一些变化。

image-20230305200910095

从图中可以看出移码全0和全1代表的真值是-128和-127,这两个数有特殊含义。

image-20230305200633371

可以稍作了解,一般不考。

不考虑这些特殊情况,我们可以探讨下浮点数的范围。

浮点数大于0时的范围为例

浮点数小于0的部分和大于0是对称的,所以知道大于0的,改变一下符号就能知道小于0的

最大值:

0 11111110 11111111111111111111111 (符号为正,阶码最大254,尾数全为1)

再套一下公式(-1)0*1.11111111111111111111111 *2254-127=(1+(1-2-23)) *2127=2127 *(2+2-23)

最小值:

0 00000001 00000000000000000000000

(-1)0*1.00000000000000000000000 *21-127=1 *2-126=2-126

所以负的浮点数的范围就是[-2127 *(2+2-23),-2-126 ]。

注意这里的范围都是规格化的,非规格化的小数可以更小。

浮点数的加减

建议去看王道视频

chatgpt:

  1. 对于参与运算的两个浮点数,首先需要将它们的指数部分进行比较,使它们的指数部分相同。这可以通过将指数较小的数的尾数部分向右移动,直到它们的指数相同。
  2. 然后,将它们的尾数部分进行加减运算。在进行加减运算之前,需要考虑它们的符号。如果两个数的符号相同,则进行加法运算;如果符号不同,则进行减法运算。
  3. 完成加减运算后,需要对结果进行规格化处理。规格化处理是将结果转换为科学计数法的形式,使得尾数部分的最高位为1,从而达到最大的精度。
  4. 最后,对规格化后的结果进行舍入处理,得到最终的结果。舍入处理是将尾数部分按照指定的舍入规则进行四舍五入等操作,使得结果满足给定的精度要求。

总之,浮点数的加减法需要将指数部分进行比较,尾数部分进行加减运算,规格化处理和舍入处理等步骤,以得到最终的结果。

加减的步骤:

  1. 写出二进制(一般是补码)

  2. 对阶,将阶数小的扩大到与阶数大的相等,再向右移动尾数。(如果是阶码大的变成阶码小的,那尾数要向左移,小数点前面的位数就不好确定导致电路不好设计)

  3. 尾数相减

    尾数采用双符号位溢出的同时,尾数可以通过第四步的规格化使其不再溢出。

  4. 规格化,注意如果是负数补码规格化的话最高数位得是0、

  5. 舍入

image-20230305210608689
  1. 判断溢出,一般都是判断阶码是否溢出。

例子:

image-20230305204522523

规格化移位的同时别忘了阶码也要改变。

最后的结果一般还需要转为原码表示。

浮点数的乘除

今年考纲对乘除不做要求,了解即可。

浮点数的乘除法运算_浮点数除法_xiaotai1234的博客-CSDN博客

其实之前有想过这么一个问题,既然float范围大还能保持一定的精度,那为什么还要int,long之类的整形变量,以int和float举例,float尾数可表示的实际精度是24位,而int是31位,所以从这个角度看int类型虽然范围比float小,但是精度比int高。

刷题小结

  • 基数大表示的范围大,精度低。

  • 负数补码尾数规格化最高位注意是0不是1。

  • IEEE754的尾数采用的是原码表示。

  • 两个正的规格化浮点数如果阶数不同直接比较阶数就行

  • 基数不同,规格化要注意的位数也不同

  • 对阶和右规时可能需要舍入(都发生了右移)

  • 算出结果后还有最后一步判断溢出,比如算出的结果阶码的双符号为01,这就是溢出了。

  • double+float也要对阶,两个浮点数一对阶发生右移可能导致精度丢失,如果double的阶远大于float的阶,那float对阶右移后的尾数可能全变为0.

  • 浮点数的加减法:对阶不会引起阶码上溢或者下溢(因为对阶是让小的阶对齐到大的阶,大的阶本身没溢出,那对阶就不可能导致溢出),右规和尾数舍入使得阶码变大可能导致上溢,左规使得阶码减小可能导致下溢,尾数溢出不代表结果溢出,因为尾数溢出可以通过规格化纠正

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

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

相关文章

ERP(企业资源管理)概述

🌟所属专栏:ERP企业资源管理🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该系列将持续更新ERP的相关学习笔记,欢迎和我一样的小白订阅,一起学习共同进步~👉文章简介&a…

利用Python按数字顺序批量修改文件名称

为了按顺序修改文件名称,采用对【文件名称列表】进行排序的方法。 要对列表进行排序,这里使用列表的sort()方法。这个方法会在不创建新的列表的情况下直接对列表进行排序。 逆序排列:sort(reverseTrue) files.sort()结果还是不理想&#x…

quarkus 搭建与基础开发环境配置总结

quarkus搭建与基础开发环境配置总结 大纲 基础概念quarkus2.13.7脚手架工程配置配置maven3.8.7quarkus快速启动quarkus的三种打包方式quarkus将程序打包为二进制文件window环境下quarkus云原生二进制文件打包环境搭建使用GraalVM-java11替换本地java8运行二进制文件 基础概念…

Linux操作系统学习(线程同步)

文章目录线程同步条件变量生产者与消费者模型信号量环形队列应用生产者消费者模型线程同步 ​ 现实生活中我们经常会遇到同一个资源多个人都想使用的问题,例如游乐园过山车排队,玩完的游客还想再玩,最好的办法就是玩完的游客想再玩就去重新排…

分享几种WordPress怎么实现相关文章功能

一淘模板(56admin.com)给大家介绍一下WordPress代码实现相关文章的几种方法,希望对大家有所帮助! WordPress很多插件可以实现相关文章的功能,插件的优点是配置简单,但是可能会对网站的速度造成一些小的影响…

做数据分析有前景吗?

当然有前景的。 每个行业都有发展前景,只是看你自身的技能情况或者关系人脉、软实力方面是否到位,不同的行业要求不一样。作为数据分析领域而言,属于IT行业,看的是你的专业技能;只要你技能过硬,就能在行业…

蓝桥杯 时间显示

题目 输入输出样例 示例 1 输入 46800999输出 13:00:00示例 2 输入 1618708103123输出 01:08:23评测用例规模与约定 对于所有评测用例,给定的时间为不超过 10^{18}1018 的正整数。 运行限制 最大运行时间:1s最大运行内存: 512M 基础知识 时间的转换…

Go底层原理:一起来唠唠GMP调度(一)

目录前言一、进程、线程、Goroutine1、进程与线程2、Goroutine二、Go调度器设计思想1、线程模型1.1 内核级线程模型1.2 用户级线程模型1.3 混合型线程模型2、 被废弃的 G-M 调度器2.1 了解 G-M 调度如何工作3、如今高效的 GMP 模型3.1 GMP模型调度流程3.2 GMP调度设计策略3.3 G…

【Vue3】封装数字框组件

数量选择组件-基本结构 &#xff08;1&#xff09;准备基本结构 <script lang"ts" setup name"Numbox"> // </script> <template><div class"numbox"><div class"label">数量</div><div cla…

C语言-基础了解-19-C位域

C位域 一、C位域 如果程序的结构中包含多个开关量&#xff0c;只有 TRUE/FALSE 变量&#xff0c;如下&#xff1a; struct {unsigned int widthValidated;unsigned int heightValidated; } status;这种结构需要 8 字节的内存空间&#xff0c;但在实际上&#xff0c;在每个变…

引领云数仓创新浪潮 HashData闪耀PostgreSQL中国技术大会

3月3日-3月5日&#xff0c;第12届PostgreSQL中国技术大会在杭州举行。本次大会以“突破•进化•共赢——安全可靠&#xff0c;共建与机遇”为主题&#xff0c;以线上线上结合的方式&#xff0c;邀请了PG领域众多行业大咖、学术精英及技术专家&#xff0c;共同探讨数据库未来的发…

【C/C++ 数据结构】-八大排序之 归并排序其它排序

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【C/C数据结构与算法】 分享&#xff1a;本王在此&#xff0c;狼狈为奸者&#xff0c;谋权篡位者&#xff0c;倒行逆施者&#xff0c;都得死&#xff01; ——岐王李茂贞《画江湖…

Linux 静态与动态编译、静态库与动态库

文章目录一、库的简介二、静态链接和动态链接1、静态链接2、动态链接3、GCC 下动态库与静态库三、静态库制作和使用四、动态库制作和使用总结一、库的简介 什么是库文件呢&#xff1f; 所谓库文件&#xff0c;大家可以将其等价为压缩包文件&#xff0c;该文件内部通常包含不止…

MyBatis源码分析(六)MetaObject工具类的使用与源码分析

文章目录一、MetaObject基本使用二、关键类源码分析1、MetaObject的构造方法2、PropertyTokenizer分词器3、BeanWrapper4、MetaClass5、DefaultReflectorFactory6、Reflector7、总结三、MetaObject的getValue源码分析写在后面一、MetaObject基本使用 public class User {priva…

OPT(奥普特)一键测量传感器SmartFlash高精度的四重保证

OPT&#xff08;奥普特&#xff09;一键测量传感器SmartFlash集成了机器视觉的边缘提取、自动匹配、自动对焦、自动学习及图像合成等人工智能技术&#xff0c;采用双远心光路及多角度照明系统设计&#xff0c;搭载高精度运动平台&#xff0c;并通过亚像素边缘提取算法处理图像&…

Mysql全解[中级篇]

目录存储引擎MySQL体系结构1). 连接层2). 服务层3). 引擎层4). 存储层存储引擎介绍存储引擎特点InnoDBMyISAMMemory文件区别及特点存储引擎选择索引无索引情况有索引情况特点索引结构二叉树红黑树B-TreeBTreeMySQL中优化之后的BTreeHash索引分类聚集索引&二级索引回表查询索…

双周赛99(贪心、数学、区间合并计算、换根DP)

文章目录双周赛99[6312. 最小和分割](https://leetcode.cn/problems/split-with-minimum-sum/)贪心[6311. 统计染色格子数](https://leetcode.cn/problems/count-total-number-of-colored-cells/)找规律[6313. 统计将重叠区间合并成组的方案数](https://leetcode.cn/problems/c…

规并排序(Swift版本)

Overview 概述 时间复杂度为 O(nlogn) ;适合大规模的数据排序 ;相比于冒泡排序、插入排序、选择排序这三种排序算法, 更加常用 ;用到了分治思想(即分而治之, 英文叫 “Divide and conquer”)&#xff0c;非常巧妙 ;英文名称: Merge Sort ; 分治思想, 在很多领域都有广泛的应用…

windows系统安装Linux虚拟机教程

虚拟机的安装首先要下载虚拟机的安装包&#xff0c;当前最新版本是VMware 16.2.1。软件我都已经给大家准备好了&#xff08;含序列号&#xff09;&#xff0c;大家在这里下载就好。虚拟机安装包下载完毕之后&#xff0c;将它安装到电脑里。这个安装过程很简单&#xff0c;一路下…

Linux操作系统学习(线程池)

文章目录线程池线程池原理代码示例单例模式饿汉模式懒汉模式饿汉懒汉对比其他的锁线程池 线程池原理 ​ 线程池是一种线程使用模式。在多线程应用中&#xff0c;若每有一个任务&#xff0c;线程就去调度相应的函数去创建&#xff0c;当任务过多时&#xff0c;每次都去调度且每…