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

news2024/9/30 21:28:47

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

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

目录

浮点数与整形储存的不同

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

浮点数的存储过程:

浮点数取的过程



浮点数与整形储存的不同

#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.coloradmin.cn/o/1540636.html

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

相关文章

which is not functionally dependent on columns in GROUP BY clause 错误解决方法

今天遇到了which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by的错误&#xff0c;记录一下解决方法。 该错误是因为在SQL语句中用到了聚合函数&#xff0c;但是聚合函数之外的字段没有全部放到group …

电脑电池健康度查询

首先使用winr 输入cmd&#xff0c;打开黑窗口 再出入以下代码&#xff1a; powercfg/batteryreport将路径中文件找到即可查看电池健康度。

软件测试(自动化测试)

1. Selenium 1.1 Selenium是什么&#xff1f; 用来做web自动化测试的框架。 1.2 Selenium特点 支持各种浏览器&#xff0c;支持各种平台&#xff0c;支持各种语言&#xff0c;有丰富的API&#xff0c; 1.3 工作原理 1.4 Selenium环境搭建 下载配套浏览器及驱动 这里使用Ch…

vcs编译选项--不常用

1&#xff09;如何查看波形的毛刺&#xff08;glitch&#xff09; 参考&#xff1a;公众号&#xff1a;IC学社 需要添加仿真选项&#xff1a;fsdbglitch0 “值得说明的是&#xff0c;glitch 对 design 是非常不好的&#xff0c;需要规避&#xff0c;设计代码中应该具有检查 g…

Express:快速搭建Node.js应用的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

DataV 在HTML中使用

一&#xff1a;什么是DataV 介绍 | DataV (jiaminghi.com) 组件库基于Vue &#xff08;React版 (opens new window)&#xff09; &#xff0c;主要用于构建大屏&#xff08;全屏&#xff09;数据展示页面即数据可视化&#xff0c;具有多种类型组件可供使用&#xff1a;…

[leetcode] 138. 随机链表的复制

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 n…

Spring Bean加载优先级

当我们使用 ConditionalOnMissingBean / ConditionalOnBean注解去给某个 bean 注入赋予条件时&#xff0c;那在条件判断时我们需要确保条件判断过程所需的环境已准备好。 举个例子 下面的代码中有两个配置类&#xff0c;涉及两个 Bean 的注入 配置类 ConfigA 需要注入一个 A…

taro之Swiper的使用

图样&#xff1a; 往往我们需要轮播图去显示我们想要的图片之类的 这是工作的代码 <View classNametop-title><SwiperclassNamebanner-swiperinterval{3000}circularautoplay>{homeBannerList.map((item) > {return (<SwiperItem key{item.id}><View…

Linux之文件系统与软硬链接

前言 我们之前阐述的内容都是在文件打开的前提下, 但是事实上不是所有文件都是被打开的, 且大部分文件都不是被打开的(也就是文件当前并不需要被访问), 都在磁盘中进行保存. 那这些没有被(进程)打开的文件, 也是需要被管理的! 对于这部分文件核心工作之一是能够快速定位文件…

【C++】仿函数优先级队列反向迭代器

目录 一、优先级队列 1、priority_queue 的介绍 2、priority_queue 的使用 3、 priority_queue 的模拟实现 1&#xff09;priority_queue()/priority_queue(first, last) 2&#xff09;push&#xff08;x&#xff09; 3&#xff09;pop&#xff08;&#xff09; 4&#…

web自动化--元素定位之xpath和css

元素定位 xpath绝对路径相对路径案例xpath策略&#xff08;路径&#xff09;案例xpath策略&#xff08;层级、扩展&#xff09;属性层级与属性层级与属性拓展层级与属性综合 csscss选择器&#xff08;id、类、标签、属性&#xff09;id选择器类选择器标签选择器属性选择器案例-…

2024年 前端JavaScript Web APIs 第五天 笔记

5.1-BOM和延迟函数setTimeout 5.2-事件循环eventloop 1-》 3 -》2 1-》 3 -》2 5.3-location对象 案例&#xff1a;5秒钟之后自动跳转页面 <body><a href"http://www.itcast.cn">支付成功<span>5</span>秒钟之后跳转到首页</a><sc…

对话Midjourney创始人:图片仅是起步,人工智能将全面改变学习、创意和组织。

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ​ 发布在https://it.weoknow.com 关注我 Midjourney 是一家神奇的公司&#xff0c;11 人改变世界&#xff0c;创造伟大的产品。…

并发编程-Synchronized介绍(结合源码和hostpot说明)

目录 一、Synchronized 概述 二、Synchronized在并发编程中解决的问题 2.1 解决原子性问题 2.1.1 问题代码 2.1.2 执行结果 2.1.3 优化代码 2.1.4 测试结果 2.1.5 优化代码分析 2.1.5.1 编译java源文件程序 2.1.5.2 查看编译文件 2.1.5.3 分析编译文件 2.2 解决可见…

windows安装ssh

一、下载ssh https://github.com/PowerShell/Win32-OpenSSH/releases/download/v8.1.0.0p1-Beta/OpenSSH-Win64.zip 二、安装ssh 解压到C:\Program Files\OpenSSH-Win64 配置环境变量 把 C:\Program Files\OpenSSH-Win64 加到path环境变量里面 C:\Program Files\OpenSSH-Win64&…

百度文心一言(ERNIE bot)API接入Android应用

百度文心一言&#xff08;ERNIE bot&#xff09;API接入Android应用实践 - 拾一贰叁 - 博客园 (cnblogs.com) Preface: 现在生成式AI越来越强大了&#xff0c;想在android上实现一个对话助手的功能&#xff0c;大概摸索了一下接入百度文心一言API的方法。 与AI助手交换信息的…

elementary OS7 Ubuntu 22.04中硬盘挂载报错

elementary OS7 Ubuntu 22.04中硬盘挂载报错 背景目标思路解决方法 背景 上周末安装elementaryos7的过程中将windows10的引导文件搞丢了&#xff0c;这两天准备修复一下&#xff0c;保险期间将固态硬盘上的文件备份到移动硬盘上&#xff0c;备份过程中出现报错的问题&#xff…

DUKPT流程简析

文章目录 一、DUKPT流程简析 一、DUKPT流程简析 接着上一篇文章DUKPT讲 依旧引用上图&#xff0c;我们单看POS和Acquirer Host这两个结点之间&#xff08;其它结点之间的处理&#xff0c;基本类似&#xff09;&#xff1a; Acquirer在布放POS到商场时&#xff0c;已经提前给…

【C语言进阶篇】文件操作(上)

【C语言进阶篇】文件操作&#xff08;上&#xff09; &#x1f955;个人主页&#xff1a;开敲 &#x1f525;所属专栏&#xff1a;C语言 &#x1f33c;文章目录&#x1f33c; 1. 为什么使用文件&#xff1f; 2. 什么是文件&#xff1f; 2.1 程序文件 2.2 数据文件 2.3 文件名…