数据的表示和存储——

news2025/3/1 4:37:32

目录

浮点数的编码表示

浮点数类型

​编辑

浮点数的表示

(1)浮点数(Float Point)的表示范围

(2)规格化数形式

(3)IEEE 754标准

其他形式的机器数表示

 个人总结


浮点数的编码表示

浮点数类型

C语言声明操作数类型存储长度(位)
float单精度浮点数32
double双精度浮点数64
long double扩展精度浮点数80 / 96

实数类型分为:单精度浮点,浮点双精度和扩展精度浮点

科学计数法(Scientific Notation) 与浮点数

从上面可以看出,对于一个实数都可以用一个定点整数和定点小数来表示,其中规格化的形式,小数点前面只有一个非0的数,对于二进制表示时,必定是1 

浮点数的表示

(1)浮点数(Float Point)的表示范围

  • 以下面的32位浮点数格式的规格化数为例,计算表示范围

1、第0位数代表符号位

2、第1~8位为8位移码表示阶码E(偏置常数为128)

3、第9~31位为24位二进制原码小数表示的尾数M(tips:注意这里定点小数表示尾数是采用的原码表示

规格化尾数的小数点后第一位总是1,故规定第一位默认的1不明显的表示出来,这样可以用23位表示24位的尾数

 因为原码对称,故其表示范围关于原点对称。可表示范围包括图中的阴影部分和0

机器0:即尾数为0或落在下溢区中的数

浮点数范围比定点数大,但数的个数没变多,故数之间更稀疏,且不均匀

(2)规格化数形式

为了能表示更多有效数字,通常规定规格化数的小数点前为1

 

32bit规格化数

其中:

1)S是符号位(Sign) 

2) Exponent用移码表示(移码其实就是原码加上一个偏置常数)来表示

3)Significand表示xxxxxxxxxx(部分尾数)基可以是2/4/8/16,约定信息,无需显示表示

早期的计算机各自用自己的浮点数,这样会带来的结果是在不同的计算机中采用不同的格式解析数据,其实是不通用的,所以出现了IEEE754标准

(3)IEEE 754标准

 这里插入一个链接,讲解IEEE 754非常详细的一个博客

IEEE754标准: 一 , 浮点数在内存中的存储方式 - 知乎 (zhihu.com)

 其中,需要注意的是上面的博客中没有指出阶码全0和全1是用来表示特殊情况的。

Q:为什么移码的偏置常数采用127而不是像之前的128

A:   IEEE 754标准中,单精度浮点数可表示的范围是0000 0001(-126)~1111 1110(127);如果偏置常数采用的是128,则32位浮点数可表示的范围是0000 0001(-127)~1111 1110(126),2^-126~2^127比2^-127~2^126可表示的范围大

Q:已知float型变量x的机器数为BEE0 0000H,求x的值是多少?

A:转换为2进制,1  0111 1101 110 0000 0000 0000 0000 0000

符号位:1(负数) 

阶码(指数):为避免混淆,用阶码表示阶的编码,用阶或者指数表示阶码的值

阶码:0111 1101B = 125

阶码的值:125-127 = -2(指数为-2)

尾数数值部分: 1 +1x2-1+ 1x2-2+ 0x2-3+ 0x2-4+ 0x2-5+… =1+2-1+2-2= 1+0.5 +0.25 = 1.75

所以真值是:-1.75x2^-2 = -0.4375

Q: 已知float型变量x的值为-12.75,求x的机器数是多少?
A: -12.75=-1100.11B =-1.10011B x 2^3

符号S=1
阶码E=127+3=128+2=1000 0010
显式表示的部分尾数Significant = 100 1100 0000 0000 0000 0000(第一个1可以不用显示表示出来,因为规格化规定小数点前面一个数是非0的而且只有一位,必定是一个1)

所以: x 的机器数表示为: 1 ,1000 0010, 100 1100 0000 0000 0000 0000
转换为十六进制表示为:C14C0000H

其他形式的机器数表示

前面定义的是针对规格化形式(normalized form)的数,那么,其他形式的机器数表示什么样的信息呢?

(1)0的机器数表示

0其实就是尾数部分和阶码部分都是为0的,不同的符号位表示+0和-0,二者都是有效的

How to represent 0?
exponent: all zeros
significand: all zeros
What about sign?Both cases valid.
+0: 0 00000000 00000000000000000000000
-0: 1 00000000 00000000000000000000000
(2)+∞/-∞的机器数表示

无穷其实就是阶码全为1,其中尾数部分全为0,不同的符号位表示正无穷和负无穷
浮点数除0的结果是+/-∞, 而不是溢出异常.(整数除0为异常)
为什么要这样处理? 可以利用+∞/-∞作比较。例如:X/0>Y可作为有效比较
How to represent +∞/-∞?
Exponent: all ones (11111111B = 255)
Significand: all zeros
+∞: 0 11111111 00000000000000000000000
-∞:  1 11111111 00000000000000000000000
(3)“非数”的表示(NaN)

非数,这个错误其实在编写程序的时候也是经常遇到的一种情况,其中非数就是阶码全为1,尾数部分不为0的情况
例如“Sqrt (-4.0) ”,“0/0”等的结果称为Not a Number (NaN) ,即“非数”
NaNs 可以帮助调试程序
How to represent NaN ?
Exponent: 255
Significand: nonzero
4. 非规格化数(Denorms)的表示

除了上面的三种情况,其实只剩下一种,就是阶码全为0,尾数部分不为0,这表示的就是非规格化数
How to represent Denorms?
Exponent: 0
Significand: nonzero

这张图,其实包含了很多信息,其中用规格化数表示浮点数其实不能表示完全,比如最小的整数用规格化数表示其实就是上面图中的1.0000....x2^-126,对于比如说2^-125~2^-124和2^-124~2^-123,其中后者长度是前者的两倍,但是由于尾数部分的位数是固定的,其实二者之间可以表示的数据的个数是一样的,都是2^23个,所以对于浮点数来说,数据越大,可以表示的最近的两个浮点数的距离是越来越大的,数据越小其实可以表示的数据精度越高,越有可能可以精确表示,但是数字越大,由于可以表示的数字间距越来越大,所以表示的就可能更不精确,这也是为什么我之前一直不知道为什么计算机不能表示任意的浮点数,比如0.1+0.2不是0.3会有偏差的原因,就是不能表示0.3只能取离它最近的一个浮点数来表示。

 个人总结

1、任何一个实数都可以用一个定点整数和一个定点小数来表示,其中定点整数其实就是指的整数(来表示科学计数法中的指数部分),定点小数一般表示科学计数法中的小数部分(尾数)。

2、浮点数是有精度的,之前是不知道为什么有的浮点数在计算机中是没有办法存储和表示的,只能根据某个特定的规则进行舍入和表示,而且浮点数数字越小越有可能精确表示,对于浮点数越大,精确表示的可能就越小,因为数越大,可表示的两个浮点数之间的距离越来越大。

3、浮点数采用科学计数法,只需要定点小数表示尾数(采用原码)和定点整数表示指数部分就可以表示任意一个浮点数

4、IEEE 754标准的一个好的博客

IEEE754标准: 一 , 浮点数在内存中的存储方式 - 知乎 (zhihu.com)

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

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

相关文章

深度学习_Learning Rate Scheduling

我们在训练模型时学习率的设置非常重要。 学习率的大小很重要。如果它太大,优化就会发散,如果它太小,训练时间太长,否则我们最终会得到次优的结果。其次,衰变率同样重要。如果学习率仍然很大,我们可能会简…

MySQL NDB Cluster使用docker compose一键部署

本文主要用来学习MySQL NDB Cluster 解决学习过程中的痛点:需要开启N台VMware虚拟机,电脑不堪重负 使用docker部署,完美解决 本文使用的docker image: mysql/mysql-cluster:8.0 创建mysql_cluster目录,后续操作都在这个目录下 …

基于html+css的盒子展示7

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

系统集成项目管理工程师软考第三章习题(每天更新)

第一章指路:系统集成项目管理工程师软考第一章习题(已完结)_程序猿幼苗的博客-CSDN博客 第二章指路:系统集成项目管理工程师软考第二章习题(已完结)_程序猿幼苗的博客-CSDN博客 第3章信息系统集成专业技术…

基于密集学习的半监督目标检测

文章目录Dense Learning based Semi-Supervised Object Detection摘要本文方法实验结果Dense Learning based Semi-Supervised Object Detection 摘要 提出了一种基于密集学习(DSL)的无锚点的半监督目标检测算法用于分配多层级和精确的密集像素伪标签的自适应过滤器用于生成稳…

C++13:搜索二叉树

目录 搜索二叉树概念 模拟实现搜索二叉树 插入函数实现 插入函数实现(递归) 查找函数实现 删除函数实现 删除函数实现(递归) 中序遍历实现 拷贝构造函数实现 析构函数实现 赋值重载 我们在最开始学习二叉树的时候,…

【网络】Internet 协议版本 6 (IPv6)

文章目录IPv6 寻址文本表示形式地址类型IPv6 路由邻居发现IPv6 自动配置自动配置类型IPv6 移动性禁用或启用 IPv6配置步骤代码启用操作系统启用来源Internet 协议版本 6 (IPv6) 是 Internet 的网络层的标准协议套件。 IPv6 旨在解决当前版本的 Internet 协议套件(称…

二叉树前中后层遍历(递归/非递归)(简单易懂(*^ー^))

文章目录二叉树的遍历1 先序遍历1.1 递归1.2 非递归2 中序遍历2.1 递归2.2 非递归3 后序遍历3.1 递归3.2 非递归4 层序遍历5 前中后层序完整可运行代码(C)二叉树的遍历 1 先序遍历 1.1 递归 先序遍历(Preorder Traversal),即根左右的顺序遍…

Anaconda3安装配置/创建删除虚拟环境/在特定虚拟环境下安装库

1. Anaconda3彻底卸载 先说Anaconda3的卸载,在Anaconda3安装路径下有一个Uninstall-Anaconda3.exe,右键以“管理员身份运行”,可执行完全卸载 2. 下载与安装Anaconda3 官网地址https://repo.anaconda.com/ 点击Anaconda Distribution&…

自学大数据第14天NoSQL~MongoDB及其命令

这几天主要是看了一下mongodb的一些知识,网上也有一些教程,今天主要是复习一下mongodb 启动mongodb 在连接mongodb前首先要创建数据存放目录与日志存放目录,还得保证当前用户对这两个目录有相应的读写操作 mongod --dbpath/usr/local/mongodb/data/db/ --logpath/usr/lcoal/mon…

(四)【软件设计师】计算机系统—基础单位进制

文章目录一、计算机基础单位二、进制1.进制表示符号2.进制之间的转换:(1)十进制转换为二进制(例子:173)(2)十进制转换为八进制(3)十进制转换为十六进制(4)二进制转换为十进制&#x…

Linux入门 - 最常用基础指令汇总

目录 ls指令 pwd指令 cd指令 touch指令 mkdir指令 rmdir指令 && rm 指令 man指令(重要) cp指令(重要) mv指令(重要) cat指令 more指令 less指令(重要) head指令…

交换机PCB板布局布线注意事项

由于板卡在工作中会受到各种各样的干扰,这些干扰不仅影响系统运行的稳定性,同时也有可能带来误差,因此考虑如何抑制干扰,提高电磁兼容性是PCB布局布线时的一项重要任务。海翎光电的小编现将PCB布局布线中需要主要考虑的因素列在下…

银行数字化转型导师坚鹏:深度解读《中华人民共和国数据安全法》

深度解读《中华人民共和国数据安全法》 ——中国数据安全立法 助力企业稳健发展课程背景: 很多金融机构存在以下问题: 不清楚数据安全法立法背景? 不知道如何理解数据安全法相关政策? 不清楚如何数据安全进行合规建设&#xf…

【前端之旅】Vue入门笔记

一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…

计算机组成原理第二章数据的表示与运算(中)

提示:且行且忘且随风,且行且看且从容 文章目录前言2.2.0 奇偶校验码(大纲已删)2.2.1 电路的基本原理 加法器设计2.2.2 并行进位加法器2.2.3 补码加减运算器2.2.4 标志位的生成2.2.5 定点数的移位运算2.2.62.2.6.1 原码的乘法运算2.2.6.2 补码的乘法运算2…

Linux下异步socket客户端

文章目录socket 客户端1. 创建socketsocket()函数返回值2. 设置socket的属性connect函数sockaddr_in结构体inet_pton函数3. fcntl设置非阻塞4. recv函数socket 客户端 1. 创建socket socket()函数 #include <sys/socket.h> int socket(int domain, int type, int proto…

四、线程安全,synchronized,volatile(JMM)【4/12 5/12 6/12】【多线程】

4. 多线程带来的的风险-线程安全 (重点) 4.1 观察线程不安全 static class Counter {public int count 0;void increase() {count;} } public static void main(String[] args) throws InterruptedException {final Counter counter new Counter();Thread t1 new Thread(()…

数据结构——排序(4)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年4月12日 内容&#xff1a;数据结构排序内容讲解 目录 前言&#xff1a; 1.快速排序中的递归&#xff1a; 2.小区间优化&#xff1a; 3.递归改非递归&#xff1a; 4.归并排序&#xff1a; 5.归并排序的非递归形式&…

Revit中如何绘制倾斜的屋顶及一键成板?

Revit中如何绘制倾斜的屋顶&#xff1f;如下图所示&#xff0c;像这种坡屋顶有两种方法进行绘制。 第一种&#xff1a;定义坡度。 1、点击建筑选项卡中的屋顶按钮。选择使用矩形工具。 2、在选项栏中&#xff0c;偏离值修改为500&#xff0c;把屋顶迹线绘制出来。 3、取消这三…