浮点型数据规范以及规格化与非规格化数据(更新:原文疑问已解)

5 篇文章 0 订阅
1 篇文章 0 订阅

最近需要在硬件中处理一些浮点型数据,所以就花了一上午时间重新温习了一下浮点型数据的一些规范和标准,又有很多新收获,将他们整理出来。

为了容易理解和对比,以下整理分别列出单精度浮点和双精度浮点的对应情况。

1)定义:

单精度浮点数为32位,符号1位,阶码8位,尾数23位。如下

符号位阶码尾数
1 bit8 bit 23 bit

双精度浮点数为64位,符号1位, 阶码 11位,尾数52位。如下

符号位阶码尾数
1 bit11 bit 52 bit

2)表示方式:

在计算机中我们都是用二进制(非0即1)数据表示,因此以上所说的位数都是指二进制的位数。

符号位表示这个数据的正负,0表示正数,1表示负数;

阶码表示指数部分;

尾数表示小数部分;

我们应该都学过科学计数法,以上描述就是对应科学计数法的表示情况,举个十进制科学计数法的例子:

-1.2304x10^3(真实值为-1230.4)

符号位为1(负数),阶码为3(指数),尾数为1.2304

在十进制的科学计数法中,小数点前面的数字永远不会是0,一定是1~9中的一个数字,这同样适用于二进制的科学计数法,即小数点前面的数字一定是个1(因为二进制非0即1),因此我们就默认了这个情况,在尾数中不包含这个1(称为隐藏位),单精度尾数23 bit(双精度 52 bit)表示的都是小数点后面的数据。(有一种特殊情况后面会讲

对于阶码部分,因为指数也有正指数和负指数之分,对于一个8bit数据,表示范围为0~255;11bit表示范围为0~2047;指数是通过一个移码来表示,即在阶码的基础上减去一个定值偏置(8bit 为  127,11bit 为 1023),因此一个8bit 阶码表示的指数范围为-127~12811bit对应 -1023 ~ 1024),但是在IEEE标准中,上下边界(-127,128,-1023,1024)被保留留作它用(例如溢出情况等),因此可表示的实际指数范围为-126~127 -1022 ~ 1023);

所以一个单精度数据10101100110111100....00110(32bit)表示的数值为:

-1.10111100....00110x2^(01011001-127),其中小数点前面的1是默认的,2和127是十进制表示;

一个双精度数据01010001110011010101110......010010(64bit)表示的数值为:

+1.11010101110......010010x2^(10100011100-1023)

3)最大值、最小值:

我们首先来看单精度的情况,如上所述,一个32bit单精度可表示的

最大正数为 1.111111111....111x2^127(第一个数为二进制),转成十进制为:

(2^24-1)x2^(127-23) = (2^24-1)x2^104,即 3.4028235E+38

同理,可得最小负数为-(2^24-1)x2^104,即-3.4028235E+38

对于64bit双精度:

最大正数为(2^53-1)x2^(1023-52)=(2^53-1)x2^971,即1.79769313486231570E+308

最小负数为-(2^53-1)x2^971,即-1.79769313486231570E+308

重点来了

重点来了

重点来了

“眼尖”的朋友可能已经发现,为什么没说最大负数和最小正数?对咯,因为存在前面所说的某种特殊情况

之前所说的小数点前面那个默认的1,是在科学计数法的前提下来描述一个数据,但是,因为这个1的存在,它影响了我们可以表达的最小正数精度,什么意思呢?我们来考虑一下(单精度情况),当阶码为最小值1(0被保留它用)时,对应的指数为-126,尾数最小值只能全为0,此时这是可以表达的最小正数了,但是由于前面默认的1,所以所表达的最小值为1x2^(-126),即 1.1754943E-38,

但是我们明明可以表达更小的数据的,去掉默认的1,尾数最后一位置1,其他位数为0,对吧?

嗯,IEEE标准也是这样来考虑的,此时的数据称为非规格化数据。

与之对应的就是规格化数据:即小数点前面默认为1,尾数所有数据表示的都是小数点后面的数据,此时称为规格化数据;

当阶码已经为最小值(1,指数为-126)以后,尾数部分包含全部的小数部分,此时是没有隐藏位的,这样的数据称为非规格化数据,通过引入非规格化数据,使得我们可以表达的最小正数又提高了多个量级。

对于单精度(32bit)而言:

规格化:

最小正数为:1x2^(-126),即1.1754943E-38

最大负数为:-1x2^(-126),即-1.1754943E-38

非规格化:

最小正数为:2^(-23)x2^(-126)=2^(-149),即1.401298E-45

最大负数为:-2^(-149),即-1.401298E-45

对于双精度(64bit)而言:

规格化:

最小正数为:1x2^(-1022),即2.2250738E-308

最大负数为:-1x2^(-1022),即-2.2250738E-308

非规格化:

最小正数为:2^(-52)x2^(-1022)=2^(-1074),即4.94065645E-324

最大负数为:-2^(-52)x2^(-1022)=2^(-1074),即-4.94065645E-324

以上

(这里其实还有一个小疑点,就是从规格化数据过度到非规格化数据,是如何过度区分的呢??)

2022年4月5日

填坑时间到(2023年1月12日)

----------------------------我是分割线------------------------------------

----------------------------我是分割线------------------------------------

之前整理这部分浮点数据内容时,还有一个小疑问就是上面的最后一句话,规格化数据到非规格化数据是如何过度的,今天偶然重温了一下“深入理解计算机系统”课程,人家讲解的还是很清晰的,如果理解了我后面要说的内容,就会发现我前面描述的部分文字是有错误或不准确的,当然为了让大家加以区分,我就不修改前面的文字了,知道错误的同学可以在评论区输出,就可以说明你是真的理解浮点数据了,哈哈哈

直接上图:

 

不得不说,搞IEEE标准的这帮子人还是非常聪明的

上面的图中基本上包含了浮点数据的大部分知识点了,图中例子是8bit浮点数据,1bit符号位,4bit阶码(此时的偏置是7),3bit的尾数

定义如下:

当阶码数值全为零(前面所说特殊情况的一种)的时候表示非规格化数据,此时的指数定义为1-7= -6,尾数部分没有隐藏的1,二进制的001就是指0.001即十进制的1/8,此时尾数全零就是指真值为0(浮点的全零刚好对应上了真值0,这也是由于设置指数偏置的一种友好结果),根据图中所示,我们可以看到数值由零递增了非规格化数据可表示的最大值,即阶码全为0尾数为111

当阶码为非零时,表示规格化数据,此时指数定义为 exp-7(exp表示阶码),尾数部分有隐藏的1,二进制000是指1.000即十进制的1,我们发现,非规格化数据与规格化数据完成了完美的平滑过渡(例子中 从7/512到8/512的平滑过渡),不得不说,厉害!厉害!厉害!

完结

课程是CMU 15-213 CSAPP 深入理解计算机系统,B站已经有中文字幕的课程了,为大家附上学习链接 我是课程链接​​​​​​​

 

  • 20
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1 大数据是 2012 的时髦词汇,正受到越来越多人的关注和谈论。大数据之所以受到人们 的关注和谈论,是因为隐藏在大数据后面超千亿美元的市场机会。 大数据时代,数据挖掘是最关键的工作。以下内容供个人学习用,感兴趣的朋友可以看 一下。 智库百科是这样描述数据挖掘的 "数据挖掘又称数据库中的知识发现, 是目前人工智能 和数据库领域研究的热点问题, 所谓数据挖掘是指从数据库的大量数据中揭示出隐含的、 先 前未知的并有潜在价值的信息的非平凡过程。 数据挖掘是一种决策支持过程, 它主要基于人 工智能、机器学习、模式识别、统计学、数据库、可视化技术等,高度自动化地分析企业的 数据,做出归纳性的推理,从中挖掘出潜在的模式,帮助决策者调整市场策略,减少风险, 做出正确的决策。 数据挖掘的定义 技术上的定义及含义 数据挖掘(Data Mining)就是从大量的、不完全的、有噪声的、模糊的、随机的实际应 用数据中,提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。 这个定义包括好几层含义:数据源必须是真实的、大量的、含噪声的;发现的是用户感兴趣 的知识;发现的知识要可接受、可理解、可运用;并不要求发现放之四海皆准的知识,仅支持 特定的发现问题。 与数据挖掘相近的同义词有数据融合、人工智能、商务智能、模式识别、机器学习、知 识发现、数据分析和决策支持等。 ----何为知识从广义上理解,数据、信息也是知识的表现形式,但是人们更把概念、规 则、模式、规律和约束等看作知识。人们把数据看作是形成知识的源泉,好像从矿石中采矿 或淘金一样。原始数据可以是结构化的,如关系数据库中的数据;也可以是半结构化的,如 文本、 图形和图像数据;甚至是分布在网络上的异构型数据。 发现知识的方法可以是数学的, 也可以是非数学的;可以是演绎的,也可以是归纳的。发现的知识可以被用于信息管理,查 询优化,决策支持和过程控制等,还可以用于数据自身的维护。因此,数据挖掘是一门交叉 学科,它把人们对数据的应用从低层次的简单查询,提升到从数据中挖掘知识,提供决策支 持。在这种需求牵引下,汇聚了不同领域的研究者,尤其是数据库技术、人工智能技术、数 理统计、可视化技术、并行计算等方面的学者和工程技术人员,投身到数据挖掘这一新兴的 研究领域,形成新的技术热点。 这里所说的知识发现, 不是要求发现放之四海而皆准的真理, 也不是要去发现崭新的自 然科学定理和纯数学公式, 更不是什么机器定理证明。 实际上, 所有发现的知识都是相对的, 是有特定前提和约束条件,面向特定领域的,同时还要能够易于被用户理解。最好能用自然 语言表达所发现的结果。 商业角度的定义 数据挖掘是一种新的商业信息处理技术, 其主要特点是对商业数据库中的大量业务数据 进行抽取、转换、分析和其他模型化处理,从中提取辅助商业决策的关键性数据。 简而言之, 数据挖掘其实是一类深层次的数据分析方法。 数据分析本身已经有很多年的 历史,只不过在过去数据收集和分析的目的是用于科学研究,另外,由于当时计算能力的限 制,对大数据量进行分析的复杂数据分析方法受到很大限制。现在,由于各行业业务自动化 的实现,商业领域产生了大量的业务数据,这些数据不再是为了分析的目的而收集的,而是 由于纯机会的(Opportunistic)商业运作而产生。分析这些数据也不再是单纯为了研究的需 要,更主要是为商业决策提供真正有价值的信息,进而 获得利润。但所有企业面临的一个共同问题是:企业数据量非常大,而其中真正有价值 的信息却很少,因此从大量的数据中经过深层分析,获得有利于商业运作、提高竞争力的信 息,就像从矿石中淘金一样,数据挖掘也因此而得名。 因此, 数据挖掘可以描述为: 按企业既定业务目标, 对大量的企业数据进行探索和分析, 揭示隐藏的、未知的或验证已知的规律性,并进一步将其模型化的先进有效的方法。 数据挖掘常用的方法 利用数据挖掘进行数据分析常用的方法主要有分类、 回归分析、 聚类、 关联规则、 特征、 变化和偏差分析、Web 页挖掘等, 它们分别从不同的角度对数据进行挖掘。 分类。 分类是找出数据库中一组数据对象的共同特点并按照分类模式将其划分为不同 的类,其目的是通过分类模型,将数据库中的数据项映射到某个给定的类别。它可以应用到 客户的分类、客户的属性和特征分析、客户满意度分析、客户的购买趋势预测等,如一个汽 车零售商将客户按照对汽车的喜好划分成不同的类, 这样营销人员就可以将新型汽车的广告 手册直接邮寄到有这种喜好的客户手中,从而大大增加了商业机会。 回归分析。 回归分析方法反映的是事务数据库中属性值在时间上的特征, 产生一个将 数据项映射到一个实值预测变量的函数, 发现变量或属性间的依赖关系, 其主要研究问题包 括数据序列的趋势特征、
在OpenMV和Arduino之间传输浮点型数据,你可以使用串行通信(如UART)或者其他通信协议(如I2C或SPI)进行数据传输。下面是一个使用串行通信的示例代码: 在OpenMV端代码: ```python import sensor import image import time from pyb import UART # 初始化串口 uart = UART(3, 115200) while(True): distance = 10.5 # 浮点型数据 uart.write(str(distance) + '\n') # 将浮点型数据转换为字符串并发送 time.sleep(1000) ``` 在Arduino端代码: ```cpp #include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX pins void setup() { Serial.begin(115200); mySerial.begin(115200); } void loop() { if (mySerial.available()) { String dataStr = mySerial.readStringUntil('\n'); // 读取接收到的字符串数据 float data = dataStr.toFloat(); // 将字符串转换为浮点型数据 Serial.print("Received data: "); Serial.println(data); } } ``` 在这个例子中,OpenMV通过UART将浮点型数据转换为字符串,并发送到Arduino。Arduino通过SoftwareSerial库接收串口数据,并将接收到的字符串转换回浮点型进行处理。 请注意,使用串行通信传输浮点型数据时,需要将浮点型数据转换为字符串进行传输。在接收端,需要将接收到的字符串再次转换回浮点型进行处理。 另外,如果你的OpenMV和Arduino之间的距离较近且速率要求较高,你也可以考虑使用I2C或SPI通信协议来传输浮点型数据。这些通信协议可以提供更高的速率和更可靠的数据传输。具体的实现方式取决于你所使用的硬件和编程语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值