C语言---浮点数在内存中的存储

前面跟大家介绍了整数在内存中的存储,这次再向大家介绍下浮点数在内存中的存储。

我们常见的浮点数有3.14,1E10 等等,浮点数家族包括float,double,long double类型。

浮点数的表示范围在头文件 float.h 定义。

1.浮点数的储存

首先,我们要清楚浮点数于整数在内存中的存储方式是完全不一样的。

浮点数在内存的存储方式有一个国际标准。

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V都可以表示成以下形式:

V  =  (-1)^{S}*M*2^{E}
1.  (-1)^{S} 表示符号位,当S=0时,V为正数,当S=1时,V为负数。
2. M 表示有效数字,M是大于等于1,小于2的。
3. 2^{E} 表示指数位。
举个例子
十进制的 5.5 ,写成二进制位 101.1,相当于 1.01*2^2。
那么按照上面的公式,得到
S=0,M=1.01,E=2。
再举个例子
-5.0
-5.0的二进制形式为-101.0,相当于-1.01*2^2。
根据公式可得S=1,M=1.01,E=2。
上面我们求得S,M,E,就是浮点数在内存中得存储方式。
且IEEE 754规定:
对于32位浮点数(float),最高的一位存储符号位S,接着8位存储指数E,剩下的23位存储有效数字M。如下图

对于64位浮点数(double),最高的一位存储符号位S,接着11位存储指数E,剩下的 52位存储有效数字M。如下图

2.浮点数存的过程

IEEE 754 对有效数字M和指数E,还有一些特别的规定。

前面我们说过,M是大于等于1且小于2的,也就是说M总是写成1.xxxxx的形式,其中xxxxx表示小数部分。IEEE 754 规定 再存储有效数字M的时候只存储其xxxxx小数部分,因为其整数部分被默认为1了。 比如当M=1.01时,我们只将01存储到内存中,等到读取的再将1补上去就行了。这样做的目的是节省一位有效数字位,让其精确度更高。这样我们就清楚了为什么float被称作单精度浮点数,double被称为双精度浮点数了,因为double类型的浮点数在存储时的精确度更高。

至于指数E,情况就有颠覆炸。

首先,规定E是一个无符号整数

这就意味着,如果E为8位,它的取值范围0~255,如果E为11位,它的取值范围0~2047。

但是我们知道,在科学计数法中,指数E是可以为负数的。所以 IEEE 754 规定E在存储到内存的过程中要加上一个中间数。

对于8位的E,中间数位127。对于11位的E,中间数为1023。

例如:2^10的E=10,所以保存成32位浮点数的时候,要加上127,变成137,即10001001。

3.浮点数取的过程

指数E在内存中取出可以分成三种情况。

E不全为0或不全为1

这种情况就属于一种正常情况。我们只要将E减上127或者1023,得到真实值,再将有效数字M前加上1。ru

比如:0.5

0.5的二进制为0.1,由于规定正数部分必须为1,则写成1.0*2^-1。

则E= -1+127=126,表示为01111110,尾数部分要去掉整数部分1,为0,又因为M要存到23位,则补0,则二进制表示形式为: 0 01111110 00000000000000000000000  如下图

这也是其在内存中存储的形式。

上面是0.5存储到内存中的过程。

我们的时候取出来,发现其E不全为0或不全为1,我们将浮点数从内存中取出来的步骤和存进去的步骤相反 E为01111110 ,转换为10进制为 126,再用126-127= -1,然后将M的整数部分1补上去。最终得到 (-1)^0*1.0*2^-1,计算的0.5。

E全为0时

当E全为0时,真实E就是一个非常小的数字了,因为前面我们说过E在存入内存中,要加上一个中间数127或者1023,如果加上这个中间数E在内存中还为0的话,E的真实值为1-127或1-1023了,这时E就是一个非常小的数字了,这时也不会将M的整数部分1不上去了,这时,原来的浮点数就是一个非常逼近0的数字了,一般情况下都会默认等于0。

E全为1

当E全为1时,则表示原数无穷大。

比如算32位浮点数时,真实E为255-127=128。然而2的32次方就已经42亿多了,更别提2的128次方了。

练习题

int main()
{
 int n = 9;
 float *pFloat = (float *)&n;
 printf("n的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 *pFloat = 9.0;
 printf("num的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 return 0;
}

看到题,不要慌张,我们要冷静分析。

首先,我们创建了一个变量n,n的值为9,you

写成其二进制形式: 00000000000000000000000000001001

后来又创建了一个float 类型的指针存储了n,这时内存已经将n看作一个浮点数存储在内存中了,

这时内存中默认存的是浮点数了,将原来的二进制看成浮点数的形式,观察发现E全为0,所以当以%f 的形式打印时,会默认为0。

接着分析,

后来有对pfloat指针进行解引用,将9.0赋值给指针 。

由于是直接将9.0存储到float类型中,这时候直接用浮点数存储到内存中的方式。

将9.0转换为二进制:1001.0

在写成科学计数法的形式:1.001*2^3。由此得到 S=0,M=1.001,E=3

由于是计算的是32位浮点数,E要加上127,得到130,130的二进制表示形式位:10000010,然后M要去掉整数部分得001,因为M要存23位,在001后面补20个0。

得到完整形式为0 10000010 00100000000000000000000

这就是此时9.0在内存中的存储形式。

当后面以%d形式打印时,要以有符号整型的形式打印,这时上面的二进制就会被认作是9.0的补码,由于无符号数的原码,反码,补码相同,由上面二进制计算可得应该是一个非常大的数字。

当以%f的的格式化打印时,上面的二进制就是浮点数的存储形式的,原来是9.0,打印时也是9.0

运行代码,如下图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第二十九天(回溯5)|491. 非递减子序列、46. 全排列、47. 全排列 II(JAVA)

文章目录 491. 非递减子序列解题思路源码 46. 全排列解题思路源码 47. 全排列 II解题思路源码 总结 491. 非递减子序列 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 …

探索未来游戏:生成式人工智能AI如何重塑你的游戏世界?

生成式人工智能(Generative AI)正以前所未有的速度改变着各行各业的运作模式。其中,游戏产业作为科技应用的前沿阵地,正经历着前所未有的变革。本文将探讨生成式人工智能如何重塑游戏产业,以及这一变革背后的深远影响。…

博士推荐 | 拥有超过10年的数据解决方案经验,数据驱动的决策者

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态,用科技解决职业领域问题,提升行业数字化服务水平,提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

评估精益管理培训的有效性需要收集哪些数据?

近年来,企业纷纷寻求通过精益管理培训来提升效率和竞争力。然而,精益管理培训是否真正有效,能否为企业带来实实在在的改变,这是许多管理者和决策者关心的问题。为了回答这个问题,我们需要收集一系列关键数据来评估精益…

基于 OpenHarmony PrecentPositionLayout 开发指南

1. PrecentPositionLayout 功能介绍 1.1. 组件介绍: 鸿蒙 SDK 提供了不同布局规范的组件容器,例如以单一方向排列的 DirectionalLayout、以相对位置排列的DependentLayout、以确切位置排列的 PositionLayout 等。 但是 PositionLayout 中组件的位置是…

基于单片机收音机调幅系统设计仿真源码

**单片机设计介绍,基于单片机收音机调幅系统设计仿真源码 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机收音机调幅系统设计的仿真源码,主要实现了通过单片机控制调幅收音机的核心功能。以下是…

C++ | Leetcode C++题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; class Solution { public:int threeSumClosest(vector<int>& nums, int target) {sort(nums.begin(), nums.end());int n nums.size();int best 1e7;// 根据差值的绝对值来更新答案auto update [&](int cur) {if (abs(cur…

城市郊野公园“风筝节”视频智能识别技术安全监管方案

一、方案背景 四月天气十分舒适&#xff0c;微风拂面&#xff0c;这段时间也是游客前往户外放风筝的好时机&#xff0c;很多城市都举办了“风筝节”等活动&#xff0c;尤其是在周末节假日期间&#xff0c;城市各个郊野公园的游客量逐渐暴增。然而&#xff0c;随着参与人数的增…

C++ 十进制转十六进制

文章目录 toHexString(int n) 函数&#xff0c;输入整型数字n&#xff0c;返回 字符串string类。 #include <iostream> #include <string> #include <vector> #include <math.h> using namespace std;string toHexString(int n) {vector <int> …

CICD流水线 发布应用到docker镜像仓库

准备工作 1.先注册免费的镜像仓库 复制链接: https://cr.console.aliyun.com/cn-beijing/instances 实施 1. 新建流水线&#xff0c;选择模板 2.添加流水线源&#xff0c;及是你的代码仓库, 选择对应分支. 3.代码检查以及单元测试&#xff0c;这个步骤可以不用动它. 4. …

Java学习笔记23(面向对象三大特征)

1.5 多态 ​ *多态(polymorphic) ​ *方法或对象具有多种形态&#xff0c;是面向对象的第三大特征&#xff0c;多态是建立在封装和继承基础之上的 1.多态的具体体现 1.方法的多态 &#xff08;重写和重载体现了多态&#xff09; 2.对象的多态 ​ 1.一个对象的编译类型和…

如何魔改 diffusers 中的 pipelines

如何魔改 diffusers 中的 pipelines 整个 Stable Diffusion 及其 pipeline 长得就很适合 hack 的样子。不管是通过简单地调整采样过程中的一些参数&#xff0c;还是直接魔改 pipeline 内部甚至 UNet 内部的 Attention&#xff0c;都可以实现很多有趣的功能或采样生图结果。 本…

如何编写一份完整的软件测试报告

软件测试是软件开发过程中一个非常重要的环节&#xff0c;它有助于确保软件的质量和稳定性。编写一份完整的软件测试报告是软件测试工作的重要组成部分&#xff0c;它不仅可以帮助测试团队记录测试结果和发现的问题&#xff0c;还可以为开发团队提供有价值的反馈和改进建议。下…

我独自升级崛起下载慢/下载不了/无法下载的解决方法

我独自升级是一款RGP游戏&#xff0c;以充满独特的画风以及新的类型的挑战得到玩家们的喜爱。通过打怪、完成任务、参加活动等方式获得经验值&#xff0c;合理分配技能点数和属性点数&#xff0c;以适应不同阶段的挑战需求。掌握装备掉落、合成、升级机制&#xff0c;及时更换更…

ubuntu安装nginx以及开启文件服务器

1. 下载源码 下载页面&#xff1a;https://nginx.org/en/download.html 下载地址&#xff1a;https://nginx.org/download/nginx-1.24.0.tar.gz curl -O https://nginx.org/download/nginx-1.24.0.tar.gz2. 依赖配置 sudo apt install gcc make libpcre3-dev zlib1g-dev ope…

中药提取物备案数据库<5000+中药提取物>

NMPA中药提取物备案数据库的建立是确保中药提取物质量安全、规范生产行为、加强监管、保障公众用药安全、促进产业发展和国际化的重要措施。 通过查询中药提取物备案信息我们能了解到中药提取物的实用备案号、药品通用名称、药品生产企业、批准文号、备案日期、备案状态、中药…

Mysql启动报错:本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

Mysql启动报错&#xff1a;本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止 文章目录 Mysql启动报错&#xff1a;本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止1. 备份mysql的data文件夹2. 重新构建 Wind…

智能照明控制系统的节能优势及其应用

【摘要】&#xff1a;通过智能照明控制系统与传统照明控制的对比&#xff0c;阐明智能照明控制系统的优势&#xff0c;基本组成、在智能建筑中的应用效果以及其实施存在的问题和前景展望。 安科瑞薛瑶瑶18701709087 【关键字】&#xff1a;智能照明控制&#xff1b;系统组成&…

【御控物联】 JavaScript JSON结构转换(21):数组To对象——综合应用

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

医院智慧手术麻醉系统管理源码 C# .net有演示

医院智慧手术麻醉系统管理源码 C# .net有演示 手术麻醉管理系统(DORIS)是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人进行全程跟踪与信息管理&#xff0c;自动集成病人HIS、LIS、RIS、PACS信息&#xff0c;采集监护等设备数据&#x…