62.【C语言】浮点数的存储
目录
1.浮点数的类型
2.浮点数表示的范围
3.浮点数的特性
《计算机科学导论》的叙述
4.浮点数在内存中的存储
答案速查
分析
前置知识:浮点数的存储规则
推导单精度浮点数5.5在内存中的存储
验证
浮点数取出的分析
1.一般情况:E不全为0或不全为1
2.特殊情况:E全为0
3.特殊情况:E全为1
回到本题分析
1.printf("n的值为:%d\n", n);
2.printf("*pFloat的值为:%f\n", *pFloat);
3.printf("num的值为:%d\n", n);
4.printf("*pFloat的值为:%f\n", *pFloat);
5.其他注意事项
1.浮点数的类型
float,double,long double等等
2.浮点数表示的范围
在float.h中介绍
以下截取一部分
#define FLT_MAX 3.402823466e+38F // max value
#define FLT_MAX_10_EXP 38 // max decimal exponent
#define FLT_MAX_EXP 128 // max binary exponent
#define FLT_MIN 1.175494351e-38F // min normalized positive value
#define FLT_MIN_10_EXP (-37) // min decimal exponent
#define FLT_MIN_EXP (-125) // min binary exponent
FLT_MAX是float类型的最大值,FLT_MIN是float类型的最小值
3.浮点数的特性
浮点数在内存中无法精确保存
《计算机科学导论》的叙述
摘抄图
4.浮点数在内存中的存储
求下列代码的执行结果
#include <stdio.h>
int main()
{int n = 9;//&n被强制类型转换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;
}
答案速查
分析
前置知识:浮点数的存储规则
对《计算机科学导论》的浮点数总结后:
根据国际标准IEEE(电气和电子工程协会) 754(简称7534标准),任意一个二进制浮点数V可以表示成下面的形式:
如十进制+5.5==101.1==1.011*(此时S==0,M==1.011且1<M<2,E==2)
754标准的特殊规定
1.由于M总是可以写成1.??????的形式,因此,在计算机内部保存M时,默认这个数的第一位总是
1,因此可以被舍去,只保存后面的??????部分。比如保存1.01的时候,只保存01,等到读取的时
候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有
23位,将第一位的1舍去以后,等于可以保存24位有效数字
2.指数E
IEEE规定:E为无符号整数(unsigned int)
但在科学计数法中的E是可以出现负数的,因此IEEE修正为:
存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023
例如:在32位中,E为8位:-2-->-2+127-->125-->补码为0111 1101
在x64+debug环境下,将下列代码调试,下断点至return 0;
#include <stdio.h>
int main()
{float f = 5.5;return 0;
}
推导单精度浮点数5.5在内存中的存储
float是单精度(32位),double是双精度(64位)-->这里的32位和64位与电脑的运行环境没有关系!!
十进制5.5按IEEE标准写法:
现按照"S+E+M"的形式存储
S=0,E为2,2+127=129=1000 0001,M=1.011
舍去M的第一位,并补满23位
最终为 0 10000001 011000000000000000000004
转换为十六进制:0100 0000 1011 0000 0000 0000 0000 0000
-->40 B0 00 00
验证
x86+debug环境下,打开内存窗口,输入&f
f在内存中存储为00 00 b0 40(小端序存储)
浮点数取出的分析
1.一般情况:E不全为0或不全为1
按存储规则反过来还原即可
2.特殊情况:E全为0
指数E等于1-127(或1-1023)
注意:这里不是0-127或0-1023!如果E为0,则权为,这样就不能表示小数!则下方所说的极小的小数也就不成立了
有效数字M不再加上第一位的1,而是还原为0.xxxxxx的极小的小数(权为)(趋近于+0或-0)
3.特殊情况:E全为1
11111111b=255-->255-127=128(权为2的128次方),表示+∞或-∞(正负取决于符号位S)
回到本题分析
1.printf("n的值为:%d\n", n);
整型数字以整型打印,为9
2.printf("*pFloat的值为:%f\n", *pFloat);
整型9以单精度浮点打印
整型9在内存中的存储为09 00 00 00
-->把小端序换为正常的表示顺序 0000 0000 0000 0000 0000 0000 0000 1001
-->按按照"S+E+M"的形式重新排列
0 0000000 00000000000000001001
S=0,E全为0-->2的-126次方-->
说明浮点数极小-->被忽略-->输出0.000000(默认保留小数前6位)
3.printf("num的值为:%d\n", n);
9.0-->S=0(正数:原码=反码=补码),E=,M=1.001-->3+127=130=1000 0010b
0 10000010 00100000000000000000000
按整型的形式排列:0100 0001 0001 0000 0000 0000 0000 0000
对应十六进制:41 10 00 00-->小端序存储-->在内存中排布为01 00 00 41
4.printf("*pFloat的值为:%f\n", *pFloat);
单浮点数以单浮点形式打印,为9.0
5.其他注意事项
有写十进制浮点数转换成二进制会有偏差
如3.14
二进制只能表示这样的数
具体转换的方式见《计算机科学导论》
所以在比较浮点数时可能会出现错误
复制以下代码到不同的编译器上测试
#include <stdio.h>
int main()
{if (3.14 == 3.12 + 0.2){printf("==");}else{printf("!=");}
}
VS2022
VS2019
Dev C++ TDM-GCC 4.9.2
结果都一样且正确
复制以下代码到不同的编译器上测试
#include <stdio.h>
int main()
{float a = 0.3;float b = 0.2;float c = 0.1;if (a == b + c){printf("==");}else{printf("!=");}
}
VS2022
VS2019
Dev C++ TDM-GCC 4.9.2
结果不一样,不同的编译器的精度不一样
浮点数的判断有专门的写法:比差值+规定误差(精度)
#include <stdio.h>
#include <math.h>
int main()
{if (fabs(3.12 + 0.2 - 3.14)<0.2){printf("==");}else{printf("!=");}
}
函数fabs为求浮点数绝对值函数,需要写 #include <math.h>
相关文章:
62.【C语言】浮点数的存储
目录 1.浮点数的类型 2.浮点数表示的范围 3.浮点数的特性 《计算机科学导论》的叙述 4.浮点数在内存中的存储 答案速查 分析 前置知识:浮点数的存储规则 推导单精度浮点数5.5在内存中的存储 验证 浮点数取出的分析 1.一般情况:E不全为0或不全为1 2.特殊情况:E全为0…...
GO网络编程(一):基础知识
1. 网络编程的基础概念 TCP/IP 协议栈 TCP/IP 是互联网通信的核心协议栈,分为以下四个层次: 应用层(Application Layer):为应用程序提供网络服务的协议,比如 HTTP、FTP、SMTP 等。传输层(Tra…...
【Linux】用虚拟机配置Ubuntu环境
目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件,大家自己去下啊! 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机,然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…...
酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构
一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值:" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…...
Gitのrebase用法
在 Git 中,rebase 是一种用于整合多个提交历史的操作,它可以将一个分支的变更“重放”到另一个分支上。与 merge 不同,rebase 会产生一个线性的提交历史,使得项目的历史记录更加整洁和易于理解。 1. 什么是 Rebase? …...
二分查找一>:在排序数组中查找元素的第一个和最后一个位置
1.题目: 2.解析:这里不能用传统二分,因为涉及范围,传统二分时间复杂度会降为O(N),要做些改动。 步骤一:查找区间左端点 细节图: 步骤二:查找区间右端点: 细节图: 代码…...
undeclared identifier ‘UNITY_PREV_MATRIX_M‘ - Unity Shader自己写URP,引用内部 hlsl
碰到这样的问题,居然非常淡定 这个链接里说了问题: 一个哥们A问,为什么include urp common.hlsl 提示莫名其妙 另一个哥们B说,这个issue 说了,可能是这个原因(也没正面答) 从issue我们知道&a…...
信息安全工程师(29)存储介质安全分析与防护
前言 存储介质安全分析与防护是确保数据安全与完整性的重要环节。存储介质,如硬盘、U盘、SD卡等,作为数据的载体,其安全性直接关系到数据的安全。 一、存储介质安全分析 1. 数据泄露风险 格式化不彻底:传统的格式化操作往往只能删…...
Html5知识点介绍
HTML5 是 HTML 的最新版本,它引入了许多新特性和元素来增强 Web 开发的能力和灵活性。以下是一些关键的 HTML5 知识点: 1. 语义化标签 HTML5 增加了许多新的语义化标签,用来更好地定义页面结构和内容,这些标签使代码更加清晰易读&…...
探索机器学习中的特征选择技术
在机器学习和数据科学领域,特征选择是一个关键步骤,它不仅有助于提高模型的性能,还能帮助我们更好地理解数据。本文将深入探讨特征选择的重要性、常见方法以及如何在实际项目中应用这些技术。 一、特征选择的重要性 降低维度:减…...
数造科技入选中国信通院《高质量数字化转型产品及服务全景图》三大板块
9月24日,2024大模型数字生态发展大会暨“铸基计划”年中会议在北京召开。会上,中国信通院发布了2024年《高质量数字化转型产品及服务全景图(上半年度)》和《高质量数字化转型技术解决方案(上半年度)》等多项…...
什么是分布式数据库
分布式数据库(Distributed Database)是一种数据库系统,它的数据被存储在不同的物理位置,但对用户来说表现得就像一个单一的、统一的数据库。这种系统由多个自治的数据库站点组成,这些站点通过网络相互连接,…...
从u盘直接删除的文件能找回吗 U盘文件误删除如何恢复
U盘上的文件被删除并不意味着它们立即消失。事实上,删除操作只是将文件从文件系统的目录中移除,并标记可用空间。这意味着在文件被覆盖之前,它们仍然存在于存储介质上。因此,只要文件没有被新的数据覆盖,我们就有机会恢…...
如何使用ssm实现基于HTML的中国传统面食介绍网站的搭建+vue
TOC ssm758基于HTML的中国传统面食介绍网站的搭建vue 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和笔…...
【生成模型】学习笔记
生成模型 生成模型概述(通俗解释) 生成的核心是生成抽象化的内容,利用已有的内容生成没有的/现实未发生的内容。这个过程类似于人类发挥想象力的过程。 生成模型的应用场景非常广泛,可以应用于艺术表达,如画的生成、…...
大语言模型知识点分享
1 目前主流的开源模型体系有哪些? Prefix Decoder 系列模型 核心点: 输入采用双向注意力机制,输出为单向注意力。双向注意力意味着输入的每个部分都可以关注到输入的所有其他部分,这在理解上下文时具有很强的优势。 代表模型&a…...
openpnp - 底部相机高级校正的参数设置
文章目录 openpnp - 底部相机高级校正的参数设置概述笔记修改 “Radial Lines Per Calibration Z” 的方法不同 “Radial Lines Per Calibration Z”的校验结果不同 “Radial Lines Per Calibration Z”的设备校验动作的比较总结备注END openpnp - 底部相机高级校正的参数设置 …...
劳动与科技、艺术结合更好提高劳动教育意义
在中小学教育中,劳动教育是培养学生基本生活技能和劳动习惯的重要环节。但当代的劳动教育不在单纯的劳动,而是劳动技能的提升与学习,通过学习劳动技能与实践活动,强化劳动教育与其他课程的融合,学生深刻理解劳动的意义…...
基于Hive和Hadoop的招聘分析系统
本项目是一个基于大数据技术的招聘分析系统,旨在为用户提供全面的招聘信息和深入的职位市场分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark 为核…...
目标检测评价指标
混淆矩阵(Confusion Matrix) 准确率(accuracy) 准确率:预测正确的样本数 / 样本数总数 (正对角线 / 所有) 精度(precision) 精度:预测正确里面有多少确实是…...
解决VRM格式模型在Unity中运行出现头发乱飞等问题
1、问题 通过VRoidStudio制作导出的vrm格式的模型,放在unity中使用时,一运行就会出现头发乱飞,没有自然下垂的问题 2、解决方法 将模型下的secondary中的所有VRM Spring Bone脚本中的Drag Force改为1,Hit Radius改为0 修改后…...
消息中间件---初识(Kafka、RocketMQ、RabbitMQ、ActiveMQ、Redis)
1. 简介 消息中间件是一种支撑性软件系统,它在网络环境中为应用系统提供同步或异步、可靠的消息传输。消息中间件利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。它支持多种通信协议和数据格式,…...
MySQL高阶2010-职员招聘人数2
目录 题目 准备数据 分析数据 总结 题目 一家公司想雇佣新员工。公司的工资预算是 $70000 。公司的招聘标准是: 继续雇佣薪水最低的高级职员,直到你不能再雇佣更多的高级职员。用剩下的预算雇佣薪水最低的初级职员。继续以最低的工资雇佣初级职员&…...
【Java】—— 集合框架:Collection接口中的方法与迭代器(Iterator)
目录 1. 集合框架概述 1.1 生活中的容器 1.2 数组的特点与弊端 1.3 Java集合框架体系 1.4 集合的使用场景 2. Collection接口及方法 2.1 添加 2.2 判断 2.3 删除 2.4 其它 3. Iterator(迭代器)接口 3.1 Iterator接口 3.2 迭代器的执行原理 3.3 foreach循环 1. 集…...
华证ESG工具变量(2009-2022年)
华证ESG工具变量包括以下十个关键指标: 同年份同行业的ESG均值(mean1):在同一年份和相同行业中,所有企业的ESG表现平均值。 同年份同省份的ESG均值(mean2):在同一年份和相同省份中&…...
Linux date命令(用于显示和设置系统的日期和时间,不仅可以显示时间,还能进行复杂的时间计算和格式化)
文章目录 深入探讨 Linux Date 命令1. Date 命令详细功能解析1.1 命令概述1.2 命令语法 2. 时间显示与格式化2.1 标准时间输出2.2 自定义格式输出 3. 设置系统日期和时间3.1 基本用法3.2 注意事项 4. 实用示例与脚本应用4.1 生成时间戳秒级时间戳毫秒时间戳 4.2 时间戳转换4.3 …...
高中教辅汇总【35GB】
文章目录 一、资源概览二、资源亮点三、获取方式 一、资源概览 这份教辅资源汇总,精心搜集了高中各学科的海量教辅资料,总容量高达35GB,覆盖了语文、数学、英语、物理、化学、生物、历史、地理、政治等所有必修及选修科目。从基础知识点到难…...
树莓派 AI 摄像头(Raspberry Pi AI Camera)教程
系列文章目录 前言 人们使用 Raspberry Pi 产品构建人工智能项目的时间几乎与我们生产 Raspberry Pi 的时间一样长。随着我们发布功能越来越强大的设备,我们能够支持的原生应用范围也在不断扩大;但无论哪一代产品,总会有一些工作负载需要外部…...
SpringBoot实现的师生健康信息管理平台
第1章 绪论 1.1背景及意义 随着社会的快速发展,计算机的影响是全面且深入的。人们生活水平的不断提高,日常生活中人们对医院管理方面的要求也在不断提高,由于老龄化人数更是不断增加,使得师生健康信息管理系统的开发成为必需而且紧…...
启用vnc访问Dell 服务器IDRAC 7虚拟控制台
Dell IDRAC 7 版本太老,SSL证书过期,IDRAC的Java和本地远程虚拟机控制台访问不了,怎么办? 可以启用vnc访问IDRAC 虚拟控制台...
阿里巴巴网站图片怎么做/合肥网络推广公司
背景 在微服务开发中,经常涉及到多线程需要共享变量的时候,传统的解决方案就是就是使用互斥锁,使得在每个时刻只能有一个线程访问该变量,好处就是便于编码(直接使用 synchronized 关键字进行同步访问)&…...
网站怎么做才 吸引人/网站关键词排名优化电话
plsql 查询结果窗口 不正常 无法更新!!!! kkdengdai123 |浏览 2446 次 2015-03-24 11:252016-06-23 16:26 最佳答案你的sql语句中有全角字符的空格,你需要把它删除掉,换成半角字符的空格就好了...
上海b2b网站建设/青岛seo青岛黑八网络最强
看到这篇文章:http://mt.sohu.com/20160806/n462923089.shtml 《十余年技术大牛告诉你,这些Java新技术不可错过》 虽然讲的比较泛,但是里面提到的 Callback hell, Promise, Future, Actor, Akka, Kafka , 平时都有耳闻,怎么把这些结合起来&am…...
网站开发计入什么科目/百度竞价恶意点击软件
视图是可视化的表。 本章讲解如何创建、更新和删除视图。 SQL CREATE VIEW 语句 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。 视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。 您可以向视…...
哪个网站做舞蹈培训推广效果好/网站建站方式有哪些
1.最简单用法,不带图形 MessageBox(0,不同意,提示,MB_OK); MessageBox(0,不同意,提示,MB_OKCANCEL ); 2.警告对话框: MessageBox(0,密码不能为空,请务必输入密码,警告,MB_ICONEXCLAMATION); 3.提示信息对话框: MessageBox(0,密码不能为空,请务必输入密码,提示,MB_ICONASTERISK …...
杭州做企业网站公司/汕头网站建设公司哪个好
参考:《UNIX 网络编程 卷1 : 套接字联网API》 之前都是使用数值地址来表示主机(比如:127.0.0.1),用数值端口号来标识服务器(比如:6379)。 但是有时候最好使用名字而不是数值&…...