清晰解析浮点型在内存中的存储 浮点型如何取出 IEEE754 SME 精度丢失 C语言进阶

news2024/11/21 1:30:49

🐎作者的话
本文涵盖了浮点型在内存中的如何存储、如何取出、为何有精度丢失等知识点~


跳跃式目录

    • 浮点型概括
    • 浮点数的存储
    • bit位储存模型
    • 精度丢失
    • 浮点型的取出
    • 浮点数的取出实机演示


浮点型概括

常见的浮点型数据有三种:

  1. 以科学计数法表示的:1e10、1.28e10
  2. 数据后加入字符‘f’的:3.14f、7.76f
  3. 不用科学计数法也不加f:1.22、4.89

第一种表示:
1*10^10 和 1.28*10^10
第二种表示:
用float创建的浮点数,要在后面加’f’,不然会默认为double型储。
第三种表示:
用double创建的浮点数,或没加‘f’的float创建数。


浮点数的存储

根据国际标准IEEE754规定,任意的浮点数V都可以表示为以下形式:

  • V=(-1)^S * M * 2^E
  • S等于0或1,是-1的指数位,0则正数,1则负数
  • M等于有效数字,应大于1,小于2
  • E是2的指数位,是一个有范围的正数

例:

  1. V=5.5
  2. V=9.0

首先我们要知道,十进制的小数点右边第一位,表示10的-1次方,同样,二进制的小数点后一位,是表示2的-1次方
则V=5.5可以分解成:101.1
则V=9.0可以分解成:1001.0
随后,将这个分解后的数字转为大于1,小于2的数,并将小数点移动了几位记下来,这将是E的大小

  1. V=1.011,移动2位,E=2
  2. V=1.001,移动3位,E=3

最后,如果是正数,S为0,如果是负数,S为1。

  1. V=(-1)^0 * 1.011 * 2^2
  2. V=(-1)^0 * 1.001 * 2^3

这样,你就知道如何表示一个浮点型的数了,由此可见,一个浮点型的数,其大小只与>S、M、E三个变量有关,所以在内存中对于浮点型的存储,只需要存储这三个变量可。


bit位储存模型

在这里插入图片描述
在这里插入图片描述

  • 第一张图:float的储存模型
  • 第二张图:double的储存模型
  • 图片来自比特科技

这两张图相信以各位的聪明才智,不需过多解释也能看得懂。

我们知道,M是一个大于1,小于2的数,那么不同的M之间只有小数点后面的数不同,如果我们只把M小数点后面的数存起来,取出的时候再加上1,就可以多存一位。
因此,float的M能存24位double的M能存53位

此外,对于E的存储,还有一些别的规定:

因为E是一个无符号的数,只能是正数,但是科学计数法中是可以出现负数的,所以IEEE又规定,E在存入时必须加上一个中间值

  • 对于float,E有8位,取值范围为0~255,存入时需加上255/2=127.
  • 对于double,E有11位,取值范围为0~2047,存入时需加上2047/2=1023.

比如:5.5的E是2,存入时需存2+127=129;9.0的E是3,存入时需存3+127=130.


精度丢失

上述我们说到,二进制小数点后1位是2的-1次方,后2位是2的-2次方…

即,一个浮点型的小数点后面的数,只能用0.5、0.25、0.125…等等数来拼凑起来。

若是我给一个3.141592653579,这在有限的M位下是不可能完整精确地拼凑起来的,于是就有了精度丢失
在这里插入图片描述
Look:我把3.14存进a,鼠标放在上面,显示这个数并不是精准的3.14.

这也是为什么,double型能存的数据比float型更为精准。(因为M位更多)


浮点型的取出

  • S的取出:没什么好说的,是1还是1,是0还是0.
  • M的取出:因为只存了小数点后面,取出来后要加上1.
  • E的取出:又分为三种情况,请看细细道来。

1,E全为1,此时若M全是0,则是无穷大,正负看S;若M不全是0,则这个数是NaN(未定义或不可表示的值),至于为什么,我只能说这是未尽事宜,是规定。

2,E全为0,这种情况下在取出E时,float规定E为-126,double规定E为-1022,M取出来后不再加上1,以此来表示一个无限接近于0的数,正负看S。

3,E不全0也不全1,减去127或1023拿出来即可。


浮点数的取出实机演示

在这里插入图片描述
如图,我将5.5f存入a;
在这里插入图片描述
随后,取a的地址进行观察。
因为我当前环境是x86,机器为小端存储。

PS:如果您不明白什么是小端存储,请点击:大小端字节序存储详解

所以a的地址存放的十六进制序列为:40B00000
转换为二进制:0 10000001 01100000000000000000000
观察S、M、E的位置
S:0
E:因为不全是1或全是0,应减去127,0b10000001-127=2
M:0.011+1=1.011
这样,你就把V取出来了。
这时候有同学可能要问了,这把SME三个数装上以后,是1.011*2^2是4.011啊。
请注意:此时是用二进制表示


📖博客主页:咚咚小圆帽的CSDN主页
🎁感谢您的:👍点赞⭐️收藏❤️关注🔗转发~
📚所属专栏:C语言进阶
📑相关文章:整型在数据中的存储
🔖今日寄语: 好好学习,天天向上~
⚠️本文由咚咚小圆帽于2023年1月12日在CSDN原创首发
🌏欢迎各位指出错误,非常感谢~

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

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

相关文章

php内核分析-fpm和df的问题思考

介绍 php中的disable_function是EG(ini_directives)来获得的,而phpinfo根据 EG(ini_directives) 中获取信息并打印。 然后通过zend_disable_function()函数去禁止,简单的说就是通过 func->handler ZEND_FN(display_disabled_function); 修改了handl…

ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-2-02:芯科的软件解决方案Gecko SDK

【源码、文档、软件、硬件、技术交流、技术支持,入口见文末】 【所有相关IDE、SDK和例程源码均可从群文件免费获取,免安装,解压即用】 持续更新中,欢迎关注! 虽然Silicon Labs是一家半导体公司,但是他们为…

手写spring13(xml自动扫描bean注册)

文章目录目标包扫描注解配置的使用占位符属性的填充设计类结构一、实现1、处理占位符配置——PropertyPlaceholderConfigurer2、定义Scope、Component拦截注解3、处理对象扫描装配——ClassPathBeanDefinitionScanner4、解析xml中调用扫描二、测试1、准备2、属性配置文件3、pri…

网络原理笔记一

文章目录1、局域网(LAN)2、广域网(WAN)3、网络通信基础1、IP地址2、端口号3、认识协议4、协议分层1、网络模型2、网络数据传输的基本流程1、局域网(LAN) 局域网全称:Local Area Network&#x…

【数据结构】顺序表深度剖析

目录 🛫前言🛫: 🚀一、线性表概述🚀: 🛰️二、顺序表🛰️: 1.概念及结构: 2.接口实现: ①.工程文件: ②.接口实现: ③.…

2023 铁人三项 CTF --- Misc wp

文章目录Misc一生壹世Misc手的必备技能套娃-1套娃-2套娃-3套娃-4套娃-5Misc 一生壹世 根据提示压缩包密码是谐音,所以猜测密码是1314,直接解压得到四个txt文件 然后用010分按照一生一世打开4个文件,发现每个文件的第一个字节拼起来是8950…

LeetCode题目笔记——1807. 替换字符串中的括号内容

文章目录题目描述题目难度——中等方法一:使用字典代码/Python代码/C总结题目描述 给你一个字符串 s ,它包含一些括号对,每个括号中包含一个 非空 的键。 比方说,字符串 “(name)is(age)yearsold” 中,有 两个 括号对…

什么是聚宽量化?

聚宽量化交易其实是通过编程将策略写成计算机可识别的代码,具体说可以是以python这门编程语言将与券商那边的平台搭建,例如用聚宽的向导式策略生成器就能很快的将股票交易接口翻译出来的策略,以便将平时需要查询的融资账户的持仓情况来编写代…

区块链将传统的产业运行逻辑,改造成以个体为主导的运行逻辑

新的产业之所以被成为新产业,其中一个很重要的原因在于,它的底层运行逻辑,正在发生一场深刻而又彻底的改变。然而,如果深入分析这种能够给产业的内在运行逻辑产生重塑和改变的,依然在于区块链本身。从某种意义上来讲&a…

YOLOv8 深度详解!一文看懂,快速上手

YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。 考虑到 YOLOv8 的优异性能,MMYOLO 也在第一时间组织了复现&#xf…

一篇文章搞定字符串的旋转问题(数组旋转问题)!

目录 前言 一.如何实现字符串的旋转? 1.用冒泡的思想实现 2.分别逆序左右再整体逆序来实现 二.如何快速判断一个字符串是否为另外一个字符串旋转之后的字符串? 1.相关库函数的简略学习 2.利用库函数快速实现判断 总结 博客主页:张栩睿…

数据结构基础知识(一)

1 数据结构的基本概念和算法 考点 数据结构基本概念算法 1.1 数据结构的基本概念 数据 数据是指所有能输入到计算机中的描述客观事物的符号,包括文本、声音、 图像、符号等。 数据元素 数据元素十数据的基本单位,也称节点或记录。 数据项 数据项…

【数仓】FLink+CK

1.项目分层 ODS:原始数据,包含日志和业务数据DWD:根据数据对象为单位进行分流。比如订单、页面访问等。DIM:维度数据DWM:对于部分数据对象进行进一步加工,比如独立访问、跳出行为,也可以和维度…

谷粒商城项目笔记之高级篇(三)

目录1.9.22 提交订单的问题1)、订单号显示、应付金额回显2)、提交订单消息回显3)、为了确保锁库存失败后,订单和订单项也能回滚,需要抛出异常1.9.23 创建库存上锁、解锁 业务交换机&队列1)、流程梳理2)、解锁库存实…

Vsftpd服务的部署及优化详解(图文)

目录 前言 实验环境 一、vsftpd的安装及启用 1、具体步骤 2、开启匿名用户访问功能并测试 二、vsftpd基本信息 三、匿名用户访问控制 四、本地用户访问控制 五、虚拟用户访问 1、建立虚拟用户访问 2、虚拟用户家目录的独立设定 3、用户配置独立 前言 vsftpd是“…

TapTap 算法平台的 Serverless 探索之路

分享人:陈欣昊,TapTap/IEM/AI平台负责人 摘要:本文主要介绍心动网络算法平台在Serverless上的实践。 《TapTap算法平台的 Serverless 探索之路》 Serverless 在构建应用上为我们节省了大量的运维与开发人力,在基本没投入基建人力…

(02)Cartographer源码无死角解析-(49) 2D点云扫描匹配→相关性暴力匹配1:SearchParameters

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

LeetCode分类刷题----链表篇

链表链表1.移除链表元素203.移除链表元素707.设计链表2.反转链表206.反转链表3.两两交换链表中的节点24.两两交换链表中的节点4.删除链表中的倒数第N个节点19.删除链表的倒数第N个节点5.链表相交07.链表相交6.环形链表141.环形链表142.环形链表II链表 1.移除链表元素 203.移除…

成功解决VMware安装操作系统出现分辨率的问题

文章目录问题重现问题原因问题解决方法一:拓展:1. 电脑分辨率:2. xrandr命令3. 查询后如果没有合适的分辨率解决方案参考资料问题重现 如下图: 在VMware16上安装ubuntu操作系统的时候,出现分辨率问题, 导致…

如何录屏有声音?如何录制带声音的视频

平常我们会通过录屏的方式录制电脑画面,然后再保存下来。那您是不是遇到过这种情况:录制的录屏文件只有画面没有声音。没有声音的视频还能修复吗?如何录屏有声音?怎样才能录制带声音的视频?今天小编教大家如何在录屏的…