看完就等于拿捏浮点数在内存中的储存了

诸君又该学习了,今天我们继续来一睹浮点数的奥妙真容。

经过前面文章对整形提升相关的解释,我们都对整形和字符在内存空间上的储存已经有了大概的认知,那么现在我们就来好好讲讲浮点数在内存中的储存规则。

目录

浮点数与整形储存的不同

浮点数在内存中的储存规则

浮点数的存储过程:

浮点数取的过程



浮点数与整形储存的不同

#include<stdio.h>int main()
{int a = 9;float* p = (float*)&a;printf("%d\n", a);printf("%f\n", *p);*p = 9.0;printf("%d\n", a);printf("%f\n", *p);return 0;
}

那么我们现在可以思考一下这个结果证明了什么呢?

是不是就是证明了,我们浮点数和整形数据在内存中的储存方式是不一样的,而且float类型和int整形所占字节都是4个字节,这样更能体现int和float内存储存数据的不一样。那么下面我将展开说一下float在内存中到底如何储存数据的。


浮点数在内存中的储存规则

首先这里我们先看一个公式,这使我们等下更好的理解这块知识

V   =  (−1) ^S *M * 2^E,那这里我们可以来来看看这里的S,M,E到底是什么?

(-1)^S    用来取决这个浮点型数据的正负,如果为0则为正数,如果为1则为负数。

M和E     即为一个大于1小于2的数,即1<=M<2,那么后面的2^E也很容易知道了,其为一个像科学计数法似的指数。如:5.5转化二进制浮点型表示------>101.1=1.011*2^2  那么此时M=1.001,E=2,S=0

我们这里直接甩图,让大家直接看清楚,浮点型数据中32位bit是怎么储存,打印时又要怎么读取呢。

float型

 double型

这样一看诸君是否就清楚许多,恍然大悟呢,那么先别急,这里还需讲一个知识点。

浮点数的存储过程:

浮点数存的过程 IEEE 754 对有效数字M和指数E,还有⼀些特别规定。 前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表示小数部分。 IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后面的 xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保 存24位有效数字。

至于指数E,情况就比较复杂 首先,E为⼀个无符号整数(unsigned int) 这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我 们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是 10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

 总结:计算机储存的M是直接省略整数为的1的,对于指数E我们在其基础上加上127或是1023在存取到计算机内存中,至于是加上哪个看是单精度float还是double。


下面我们看一个例子: 

我们继续拿float a=5.5这个数来举例。

这里按照上面的说法。5.5为正数,那么S=0。

然后将5.5换成二进制=101.1,在换成科学计数法=1.011*2^2,此时M=1.011,然后在计算机中储存时把整数为的1,暂时舍去,在取出来时在加回去。那么此时计算机中的

M=01100000……(23bit),然后到我们这里的E=2。再按照之前的说法在这基础上加上中间数127在储存在计算机中,那么此时计算机中的E=2+127=129,转换为二进制=10000001

然后a在计算机中的储存为0 10000001 01100000000000000000000 

然后二进制表示为40 b0 00 00,

那么是否就是这样呢,我们来用计算机来验证一下

这里VS是小端储存所以我们就看到如图的储存方式


浮点数取的过程

E不全为0或不全为1 这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效 数字M前加上第⼀位的1。 ⽐如:0.5 的⼆进制形式为0.1,由于规定正数部分必须为1,即将⼩数点右移1位,则为1.0*2^(-1),其 阶码为-1+127(中间值)=126,表⽰为01111110,⽽尾数1.0去掉整数部分为0,补⻬0到23位 00000000000000000000000,则其⼆进制表⽰形式为: 

0 01111110 00000000000000000000000


E全为0 这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,而是还 原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很小的数字。

0 00000000 00100000000000000000000


E全为1 这时,如果有效数字M全为0,表示±⽆穷大(正负取决于符号位s)

0 11111111 00010000000000000000000


最后再回到开始的代码:

#include<stdio.h>int main()
{int a = 9;float* p = (float*)&a;printf("%d\n", a);printf("%f\n", *p);*p = 9.0;printf("%d\n", a);printf("%f\n", *p);return 0;
}

 

这里我们一步一步拆分,在这段代码中int a=9.则是按整形的方式来储存,则二进制在计算机中储存为 00000000000000000000000000001001,那么在进行这么(printf("%f\n", *p);)打印时我么会把他当作浮点数的形式进行取出,此时S=0,E为全0按照上面的取出规则

E=1-127。计算机中的M=00000000000000000001001,在加上存之前舍去的1,则M=100000000000000000001001,这么计算起来M*2^-126,非常小,接近于0,所以打印出来一个

0.000000

然后到第三行打印结果,我们将9已浮点数的形式储存,浮点数9.0 等于⼆进制的1001.0,即换算成科学计数法是:1.001×2^3 所以: 9.0  =  (−1)   ^ 0  *(1.001)  ∗  2^3 , 那么,第⼀位的符号位S=0,有效数字M等于001后⾯再加20个0,凑满23位,指数E等于3+127=130, 即10000010 所以,写成⼆进制形式,应该是S+E+M,即0 10000010 001 0000 0000 0000 0000 0000

那么按照整形的方式取出来就是一个很大的数,即1091567616


文章已到末尾,诸君对浮点数储存懂否。

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

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

相关文章

41-Vue-webpack基础

webpack基础 前言什么是webpackwebpack的基本使用指定webpack的entry和output 前言 本篇开始来学习下webpack的使用 什么是webpack webpack: 是前端项目工程化的具体解决方案。 主要功能&#xff1a;它提供了友好的前端模块化开发支持&#xff0c;以及代码压缩混淆、处理浏览…

自定义序列化

3.2.2.自定义序列化 RedisTemplate可以接收任意Object作为值写入Redis&#xff1a; 只不过写入前会把Object序列化为字节形式&#xff0c;默认是采用JDK序列化&#xff0c;得到的结果是这样的&#xff1a; 缺点&#xff1a; 可读性差内存占用较大 我们可以自定义RedisTempla…

NASA数据集——2015 年30 米分辨率的地衣地面覆盖率模型估计值

cABoVE: Lichen Forage Cover over Fortymile Caribou Range, Alaska and Yukon, 2000-2015 文件修订日期&#xff1a;2021-07-21 数据集版本: 1 摘要 本数据集提供了美国阿拉斯加东部内陆和加拿大育空地区 Fortymile 研究区 2015 标称年 30 米分辨率的地衣地面覆盖率模型估…

modbus代码思路整理

void main() { eMBinit(); eMBEnable();/*1.eRcvState = STATE_RX_INIT 2.USART:USART_RX->Enable & USART_TX->Disable 3.打开TIM(5ms):Enable 4.eMBState = STATE_ENABLE*/ while(1) {…

YOLOv8-ROS-noetic+USB-CAM目标检测

环境介绍 Ubuntu20.04 Ros1-noetic Anaconda-yolov8虚拟环境 本文假设ROS和anaconda虚拟环境都已经配备&#xff0c;如果不知道怎么配备可以参考&#xff1a; https://blog.csdn.net/weixin_45231460/article/details/132906916 创建工作空间 mkdir -p ~/catkin_ws/srccd ~/ca…

SQL注入四-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件

演示案例&#xff1a; PHP-MYSQL-二次注入-DEMO&74CMSPHP-MYSQL-堆叠注入-DEMO&CTF强网PHP-MYSQL-带外注入-DEMO&DNSLOG #PHP-MYSQL-二次注入-DEMO&74CMS 1、DEMO-用户注册登录修改密码 2、CMS-74CMS个人中心简历功能 黑盒思路&#xff1a;分析功能有添加后对数…

dom元素+CSS实现阶梯动画效果

1.效果 2.代码实现 <template><div class"container"><div class"Box"><div class"box" style"background-color: red;"></div><div class"box" style"background-color: orange;&q…

湖北专升本报名照片需要<40kb怎么解决

湖北专升本报名照片需要<40kb怎么解决

vue 修改element-plus主题色

一、安装SCSS npm install sass --save-dev npm install sass-loader --save-dev npm install node-sass --save-dev npm install vue-style-loader --sava-dev 二、添加主题文件theme.scss forward "element-plus/theme-chalk/src/common/var.scss" with ($col…

特种兵旅游-扬州、南京

一、扬州 Day01 西安咸阳机场->扬州泰州机场&#xff08;扬州地界但是离泰州也嘎嘎近&#xff09;->大运河博物馆&#xff08;需要提前预约&#xff01;&#xff09;&#xff08;超级震撼&#xff09; Day02 瘦西湖&#xff08;门票有点贵&#xff0c;但是蛮值得&#x…

kubernetes负载均衡-service

一、service的概念 1、什么是service 在Kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;当我们需要访问这个应用时&#xff0c;可以通过Pod的IP进行访问&#xff0c;但是这里有两个问题:1、Pod的IP地址不固定&#xff0c;一旦Pod异常退出、节点故障&#xff0c;则会…

量子计算与大模型融合的潜力与挑战探索

量子计算与大模型融合的潜力与挑战探索 1. 背景介绍 随着人工智能技术的飞速发展&#xff0c;大模型在自然语言处理、计算机视觉等领域取得了显著的成果。然而&#xff0c;大模型训练需要大量的计算资源&#xff0c;导致训练时间长、能耗高。量子计算作为一种新型计算方式&am…

【STM32】读写BKP备份寄存器RTC实时时钟

目录 BKP BKP简介 BKP基本结构 BKP测试代码 RTC RTC简介 RTC框图 RTC基本结构 硬件电路 RTC操作注意事项 接线图 初始化 使用BKP解决只初始化一次时间 初始化参考代码 RTC设置时间 RTC读取时间 完整代码 MyRTC.c MyRTC.h main.c BKP BKP简介 BKP&#xff0…

渗透测试-ssh私钥泄露知识记录

1 ssh私钥泄露 1.1 信息探测 渗透其实是针对服务的漏洞探测&#xff0c;然后进行数据包的发送&#xff0c;获取机器的最高权限。 nmap –sV 192.168.0.1常用端口0-1023端口&#xff0c;在扫描结果中查找特殊端口&#xff0c;针对特殊端口进行探测&#xff0c;尤其是对开放大端…

pytorch中tensor类型转换的几个函数

目录 IntTensor转FloatTensor FloatTensor转IntTensor Tensor类型变为python的常规类型 IntTensor转FloatTensor .float函数&#xff1a; FloatTensor转IntTensor .int函数 Tensor类型变为python的常规类型 item函数

阿里云部署MySQL、Redis、RocketMQ、Nacos集群

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容MySQL集群配置云服务器选购CPU选择内存选择云盘选择ESSD AutoPL云盘块存储性能&#xff08;ESSD&#xff09; 镜像选择带宽选择密码配置注意事项 安装docker和docker-compose部署MySQL三主六从半同步集群一主二从同步集群规…

perl:获取同花顺数据--业绩预告

perldoc LWP::UserAgent 如果没有安装&#xff0c;则安装模块&#xff0c;运行 cpanm LWP::UserAgent 。 编写 get_yjyg_10jqka.pl 如下 #!/usr/bin/perl # perl 获取同花顺数据--业绩预告 use LWP::UserAgent; use Encode qw(decode encode); use POSIX; use Data::Dump…

pytorch如何向tensor结尾添加元素或维度--torch.cat()、torch.unsqueeze()的用法

目录 示例1 矢量后增加元素 示例2 tensor维度增加1 示例3 另一种替代unsqueeze的方法 示例1 矢量后增加元素 使用torch.cat()函数 ptorch.Tensor([1,5,0]) ptorch.cat((p, torch.Tensor([4])), 0) 结果&#xff1a; 这里&#xff0c;cat的第一个输入变量用()包绕&#xf…

Request请求参数----中文乱码问题

一: GET POST获取请求参数: 在处理为什么会出现中文乱码的情况之前, 首先我们要直到GET 以及 POST两种获取请求参数的不同 1>POST POST获取请求参数是通过输入流getReader来进行获取的, 通过字符输入流来获取响应的请求参数, 并且在解码的时候, 默认的情况是 ISO_885…

由浅到深认识Java语言(21):Math类

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…