整数与浮点数存储差异与精度损失

一起学嵌入式 2024-02-21 08:08

扫描关注一起学嵌入式,一起学习,一起成长

为什么我们代码将浮点数、整数进行强制转换,或打印输出时会出精度损失,或出错的情况?

想要搞明白这个问题,就需要了解一下整数、浮点数的存储规则。

一、浮点数存储规则 

根据国际标准IEEE(电气和电子工程协会)规定,任何一个浮点数NUM的二进制数可以写为:

NUM = (-1) ^ S * M * 2 ^ E; (S表示符号,E表示阶乘,M表示有效数字)
①当S为0时,表示一个正数;当S为1时,表示一个负数;
②M表示有效数字,1<= M <2;
③2^E表示指数
比如十进制的3.0,二进制就是0011.0 就可以写成(-1)^ 0 * 1.1 * 2 ^ 1
再比如十进制的-3.0,二进制就是-0011.0 就可以写成(-1)^ 1 * 1.1 * 2 ^ 1
而规定float类型有一个符号位(S),有8个指数位(E),和23个有效数字位(M)
double类型有一个符号位(S),有11个指数位(E),和52个有效数字位(M)
以float类型为例:

IEEE对于(有效数字)M和(指数)E有特殊的规定(以float为例): 
1.因为M的值一定是1<= M <2,所以它绝对可以写成1.xxxxxxx的形式,所以规定M在存储时舍去第一个1,只存储小数点之后的数字。
这样做节省了空间,以float类型为例,就可以保存23位小数信息,加上舍去的1就可以用23位来表示24个有效的信息。
2.对于E(指数)E是一个无符号整数所以E的取值范围为(0~ 255),但是在计数中指数是可以为负的,所以规定在存入E时,在它原本的值上加上中间数(127),在使用时减去中间数(127),这样E的真正取值范围就成了(-127~128)。
对于E还分为三种情况:
①E不全为0,不全为1:
这时就用正常的计算规则,E的真实值就是E的字面值减去127(中间值),M的值要加上最前面的省去的1。
②E全为0
这时指数E等于1-127为真实值,M不在加上舍去的1,而是还原为0.xxxxxxxx小数。这样为了表示0,和一些很小的整数。
所以在进行浮点数与0的比较时,要注意。
③E全为1
当M全为0时,表示±无穷大(取决于符号位);当M不全为1时,表示这数不是一个数(NaN)

二、测试 

代码如下:
void test(void){  float m=134.375;  char *a=(char*)&m;
printf("0x%p:%d\n",a,*a); printf("0x%p:%d\n",a+1,*(a+1) ); printf("0x%p:%d\n",a+2,*(a+2) ); printf("0x%p:%d\n",a+3,*(a+3) );}

代码输出结果:

具体的计算过程如下:

三、精度损失 

我们可以把十进制的小数部分乘以2,取整数部分作为二进制的一位,剩余小数继续乘以2,直至不存在剩余小数为止。

例如0.2可以转换为:

0.2 x 2 = 0.4 0

0.4 x 2 = 0.8 0

0.8 x 2 = 1.6 1

0.6 x 2 = 1.2 1

0.2 x 2 = 0.4 0

0.4 x 2 = 0.8 0

0.8 x 2 = 1.6 1

即:.0011001…

它是一个无限循环的二进制数,这就是为什么十进制小数转换成二进制小数的时候为什么会出现精度损失的情况。

四、整数的存储规则 

理解了浮点数的存储规则,再理解整数就很简单了。

整数在内存中都是以补码的形式进行存储,整数有正负之分。当需存储有符号数时,用第一位来表示正(0)和负(1)。

正数的反码和补码还是它本身,下面主要讨论下负数的反码和补码。反码是其原码除去最高符号位后其余位按位取反,补码是其反码在加上1 。

测试代码:
void test(void){  int8_t n=-123;  uint8_t *p=(uint8_t *)&n;
printf("%d\n",n); printf("%d\n",*p); }
输出结果:

计算过程如下:

原文:https://blog.csdn.net/u014470361/article/details/79820892

文章来源于网络,版权归原作者所有,如有侵权,请联系删除。



关注【一起学嵌入式】,回复加群进技术交流群。



觉得文章不错,点击“分享”、“”、“在看” 呗!

一起学嵌入式 公众号【一起学嵌入式】,RTOS、Linux编程、C/C++,以及经验分享、行业资讯、物联网等技术知
评论 (0)
  • 科技云报道原创。随着以大模型为代表的AIGC时代拉开序幕,算力需求持续爆发,AI与边缘深度融合已是大势所趋,越来越多的企业开始积极布局GenAI。GenAI技术的商用化部署和应用成为企业竞逐的新阵地,勾勒出大模型从“技术力”转向“生产力”的新生态。算力就是生产力,更丰富的算力资源成为人工智能竞争的核心基石。IDC预计,全球AI计算市场规模将从2022年的195亿美元增长到2026年的346.6亿美元,其中GenAI计算市场规模将从2022年的8.2亿美元增长到2026年的109.9亿美元。Gen
    科技云报到 2024-04-22 15:11 241浏览
  • 你是否考虑过,企业网络上所用到的每台设备,小到电脑、平板、电话、路由器,大到打印机、服务器,都可能潜藏网络安全风险,威胁企业的信息安全和业务?部门企业的业务开展所赖以支撑的物联网设备或者电子邮件,则更可能挑战企业的网络安全。随着数字化转型的加速,企业应当怎样进行全面的网络安全风险分析,才能有效避免这些风险?一、什么是风险分析?风险分析指的是识别、审查和分析可能对企业造成负面影响的现有或潜在网络安全风险的过程,对于识别、管理和保护可能受到网络攻击的数据、信息和资产而言至关重要。通过网络安全风险分析
    虹科网络可视化 2024-04-22 14:17 234浏览
  • STC89C52RC比普通89C52多了后缀“RC”,虽然它们都是单片机芯片,但是带有“RC”字样的单片机自带RC时钟振荡电路(有的频率可调有的频率不可调),可以在不接外部晶振就能使用,没有带“RC”这个字样的芯片一般必须安装外部晶振电路。STC89C52RC是宏晶公司的增强型MCS-51单片机,与Atmel公司的AT89C52相比,有以下优点:支持STC的2线制下载方式,下载程序更方便;支持6T模式(在6T模式下,6个时钟周期就是一个机器周期);片内集成了4kB容量的E²PROM;带有P4口,
    丙丁先生 2024-04-23 10:39 28浏览
  • 科技云报道原创。超融合作为一种云时代的IT基础架构,诞生已有十余年,如今已是一种非常成熟且主流的应用。多年的技术发展和市场需求的快速增长,让超融合成了一个非常“卷”的市场,云服务商、HCI创业公司、综合IT供应商,甚至运营商、安全公司等跨界供应商都广泛参与其中。如此“卷”的中国超融合市场,给行业用户们带来的变化是非常明显的:一方面,超融合“计算存储网络资源池”的概念已烂熟于心,市场接受度逐步达到顶峰;另一方面,超融合产品同质化严重,在选型时容易陷入“乱花渐欲迷人眼”。但值得注意的是,在云原生、A
    科技云报到 2024-04-22 18:06 62浏览
  • 本视频来自凤凰卫视《世纪大讲堂》,演讲人是中国工程院院士、中国仪器仪表学会理事长尤政院士,主题是《传感器:亟待攻克的关键“卡脖子”技术》。尤政院士是中国传感器与微米纳米技术著名专家,本视频基于其深厚的专业素养,同时深入浅出,向我国大众科普传感器知识,提到中国传感器产业一些比较尖锐的问题,向许多甚少了解我国科技发展情况的朋友,阐述了我国传感器产业面临的情况。强烈推荐!专家档案尤政 ,中国工程院院士,华中科技大学校长,中国仪器仪表学会第十届理事长,中国微米纳米技术学会理事长,主要研究方向为微米纳米技
    传感器专家网 2024-04-23 10:09 35浏览
  • 摘要      随着汽车行业转变为数据驱动的业务,软件在车辆的开发和维护中发挥了核心作用。随着软件数量的增加,相应的网络安全风险、责任和监管也随之增加,传统方法变得不再适用于这类任务。相应的结果是整车厂和供应商都在努力应对汽车软件日益增加的风险。      一种解决这一问题的新方法被提出了——为ECU软件构建一个数字孪生副本,以持续监测其处在网络安全风险环境下中的情况。使用这种方法,供应商可以充分了解网络安全风险,同时既可以用于运营中的
    经纬恒润 2024-04-22 16:16 199浏览
  • 技术突围,要选择优势充分发挥领域,比如动力电池加工,比如激光雕刻。2月7日,根据韩国研究机构SNE Research发布的最新数据显示,2023年全年,全球登记的电动汽车(EV、PHEV、HEV)动力电池装车量约为705.5GWh,同比增长38.6%。动力电池市场的飞速发展,也将用于激光焊接的蓝色激光再次推向了聚光灯下。1、动力电池加工,前景广阔以动力电池焊接为例,焊接质量的决定因素除焊接工艺外,在于激光器选型,例如针对铜材料焊接的蓝光激光器应用。“传统的红外光纤激光器在加工电池时会因为焊接出现
    艾迈斯欧司朗 2024-04-22 17:05 231浏览
  • 科技云报道原创。在最新的存储市场动态中,存储芯片大厂的减产策略显现出其效果,特别是在DDR内存领域。根据台湾工商时报的最新报道,第四季度的内存芯片合约价格出现了超出预期的上涨。这一价格变动尤其在DDR5芯片上表现突出,其价格上涨幅度达到了15-20%,而DDR4和DDR3的涨幅分别为10-15%和10%。这些数字远高于原先预估的5-10%的涨幅。在这背后是三星、SK海力士等国际存储器大厂的减产行动,以及美光计划持续减产至2024年。业界普遍预期,在供给减少的同时,人工智能、服务器等领域的需求增长
    科技云报到 2024-04-22 17:13 268浏览
  • 科技云报道原创。没有小的市场,只有还没有被发现的大生意。随着企业数字化转型的逐级深入,市场需求进一步向PaaS和SaaS层进发,使之成为公有云服务市场增长的主要动力。根据IDC最新发布的报告显示,2022-2027五年间中国公有云市场年复合增长率将达到26.9%,其中PaaS(平台即服务)增速最快,为30.5%,SaaS(软件即服务)紧随其后为28.7%。当云计算的基础设施建设完成后,中国公有云市场正在从资源驱动型延伸至技术和业务驱动。与此同时,生成式AI和大模型的快速发展,也在加速推动PaaS
    科技云报到 2024-04-22 17:24 241浏览
  • 【一文秒懂】Linux ADB调试环境搭建指南1、ADB介绍ADB:Android Debug Bridge,安卓调试桥,是用的最多的一种命令行工具,它能够在电脑端和安卓支持的设备端进行通信,其通信方式有两种:USB或者TCP/IP。它能够支持多种设备端的操作,包括:网络,脚本,安装和调试应用,文件传输等,同时也支持访问unix shell。adb命令行工具,随着安卓SDK平台工具一起发布,是安卓SDK的一个组件。 2、ADB架构及组成它是一个C/S(client-server)架构的
    _嵌入式艺术_ 2024-04-23 07:52 83浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦