当前位置: 首页 > news >正文

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*2^2(此时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标准写法:5.5=(-1)^0*1.011*2^2

现按照"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,则权为2^0,这样就不能表示小数!则下方所说的极小的小数也就不成立了

有效数字M不再加上第一位的1,而是还原为0.xxxxxx的极小的小数(权为2^{-126})(趋近于+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次方-->(-1)^0*9*2^{-126}

说明浮点数极小-->被忽略-->输出0.000000(默认保留小数前6位)

3.printf("num的值为:%d\n", n);

9.0-->S=0(正数:原码=反码=补码),E=2^{3},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

二进制只能表示这样的2^1,2^0,2^{-1},2^{-2},2^{-3},2^{-4},...,2^{-n}

具体转换的方式见《计算机科学导论》

所以在比较浮点数时可能会出现错误

复制以下代码到不同的编译器上测试

#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 是互联网通信的核心协议栈&#xff0c;分为以下四个层次&#xff1a; 应用层&#xff08;Application Layer&#xff09;&#xff1a;为应用程序提供网络服务的协议&#xff0c;比如 HTTP、FTP、SMTP 等。传输层&#xff08;Tra…...

【Linux】用虚拟机配置Ubuntu环境

目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件&#xff0c;大家自己去下啊&#xff01; 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机&#xff0c;然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…...

酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构

一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值&#xff1a;" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…...

Gitのrebase用法

在 Git 中&#xff0c;rebase 是一种用于整合多个提交历史的操作&#xff0c;它可以将一个分支的变更“重放”到另一个分支上。与 merge 不同&#xff0c;rebase 会产生一个线性的提交历史&#xff0c;使得项目的历史记录更加整洁和易于理解。 1. 什么是 Rebase&#xff1f; …...

二分查找一>:在排序数组中查找元素的第一个和最后一个位置

1.题目&#xff1a; 2.解析:这里不能用传统二分&#xff0c;因为涉及范围&#xff0c;传统二分时间复杂度会降为O(N)&#xff0c;要做些改动。 步骤一&#xff1a;查找区间左端点 细节图&#xff1a; 步骤二&#xff1a;查找区间右端点&#xff1a; 细节图&#xff1a; 代码…...

undeclared identifier ‘UNITY_PREV_MATRIX_M‘ - Unity Shader自己写URP,引用内部 hlsl

碰到这样的问题&#xff0c;居然非常淡定 这个链接里说了问题&#xff1a; 一个哥们A问&#xff0c;为什么include urp common.hlsl 提示莫名其妙 另一个哥们B说&#xff0c;这个issue 说了&#xff0c;可能是这个原因&#xff08;也没正面答&#xff09; 从issue我们知道&a…...

信息安全工程师(29)存储介质安全分析与防护

前言 存储介质安全分析与防护是确保数据安全与完整性的重要环节。存储介质&#xff0c;如硬盘、U盘、SD卡等&#xff0c;作为数据的载体&#xff0c;其安全性直接关系到数据的安全。 一、存储介质安全分析 1. 数据泄露风险 格式化不彻底&#xff1a;传统的格式化操作往往只能删…...

Html5知识点介绍

HTML5 是 HTML 的最新版本&#xff0c;它引入了许多新特性和元素来增强 Web 开发的能力和灵活性。以下是一些关键的 HTML5 知识点&#xff1a; 1. 语义化标签 HTML5 增加了许多新的语义化标签&#xff0c;用来更好地定义页面结构和内容&#xff0c;这些标签使代码更加清晰易读&…...

探索机器学习中的特征选择技术

在机器学习和数据科学领域&#xff0c;特征选择是一个关键步骤&#xff0c;它不仅有助于提高模型的性能&#xff0c;还能帮助我们更好地理解数据。本文将深入探讨特征选择的重要性、常见方法以及如何在实际项目中应用这些技术。 一、特征选择的重要性 降低维度&#xff1a;减…...

数造科技入选中国信通院《高质量数字化转型产品及服务全景图》三大板块

9月24日&#xff0c;2024大模型数字生态发展大会暨“铸基计划”年中会议在北京召开。会上&#xff0c;中国信通院发布了2024年《高质量数字化转型产品及服务全景图&#xff08;上半年度&#xff09;》和《高质量数字化转型技术解决方案&#xff08;上半年度&#xff09;》等多项…...

什么是分布式数据库

分布式数据库&#xff08;Distributed Database&#xff09;是一种数据库系统&#xff0c;它的数据被存储在不同的物理位置&#xff0c;但对用户来说表现得就像一个单一的、统一的数据库。这种系统由多个自治的数据库站点组成&#xff0c;这些站点通过网络相互连接&#xff0c;…...

从u盘直接删除的文件能找回吗 U盘文件误删除如何恢复

U盘上的文件被删除并不意味着它们立即消失。事实上&#xff0c;删除操作只是将文件从文件系统的目录中移除&#xff0c;并标记可用空间。这意味着在文件被覆盖之前&#xff0c;它们仍然存在于存储介质上。因此&#xff0c;只要文件没有被新的数据覆盖&#xff0c;我们就有机会恢…...

如何使用ssm实现基于HTML的中国传统面食介绍网站的搭建+vue

TOC ssm758基于HTML的中国传统面食介绍网站的搭建vue 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔…...

【生成模型】学习笔记

生成模型 生成模型概述&#xff08;通俗解释&#xff09; 生成的核心是生成抽象化的内容&#xff0c;利用已有的内容生成没有的/现实未发生的内容。这个过程类似于人类发挥想象力的过程。 生成模型的应用场景非常广泛&#xff0c;可以应用于艺术表达&#xff0c;如画的生成、…...

大语言模型知识点分享

1 目前主流的开源模型体系有哪些&#xff1f; Prefix Decoder 系列模型 核心点&#xff1a; 输入采用双向注意力机制&#xff0c;输出为单向注意力。双向注意力意味着输入的每个部分都可以关注到输入的所有其他部分&#xff0c;这在理解上下文时具有很强的优势。 代表模型&a…...

openpnp - 底部相机高级校正的参数设置

文章目录 openpnp - 底部相机高级校正的参数设置概述笔记修改 “Radial Lines Per Calibration Z” 的方法不同 “Radial Lines Per Calibration Z”的校验结果不同 “Radial Lines Per Calibration Z”的设备校验动作的比较总结备注END openpnp - 底部相机高级校正的参数设置 …...

劳动与科技、艺术结合更好提高劳动教育意义

在中小学教育中&#xff0c;劳动教育是培养学生基本生活技能和劳动习惯的重要环节。但当代的劳动教育不在单纯的劳动&#xff0c;而是劳动技能的提升与学习&#xff0c;通过学习劳动技能与实践活动&#xff0c;强化劳动教育与其他课程的融合&#xff0c;学生深刻理解劳动的意义…...

基于Hive和Hadoop的招聘分析系统

本项目是一个基于大数据技术的招聘分析系统&#xff0c;旨在为用户提供全面的招聘信息和深入的职位市场分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark 为核…...

目标检测评价指标

混淆矩阵&#xff08;Confusion Matrix&#xff09; 准确率&#xff08;accuracy&#xff09; 准确率&#xff1a;预测正确的样本数 / 样本数总数 &#xff08;正对角线 / 所有&#xff09; 精度&#xff08;precision&#xff09; 精度&#xff1a;预测正确里面有多少确实是…...

突破运营商限制:中兴光猫配置文件解密工具完全指南

突破运营商限制&#xff1a;中兴光猫配置文件解密工具完全指南 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 一、用户痛点解析&#xff1a;你是否正遭遇这些网络管理困境…...

three-tile: 一个为Three.js应用注入真实地形的开源LOD模型库

1. three-tile究竟是什么&#xff1f; 第一次看到three-tile这个名字&#xff0c;很多人会误以为它又是一个WebGIS框架。但实际使用后你会发现&#xff0c;这个开源库的定位非常独特——它本质上是一个专为Three.js设计的LOD地形模型库。所谓LOD&#xff08;Level of Detail&am…...

嵌入式软件发中AI技术及工具的应用

嵌入式软件开发中的人工智能技术应用与辅助方法详述及未来展望 引言 人工智能正从“被嵌入到终端设备”的单向角色&#xff0c;逐步演变为“赋能开发过程本身”的双向驱动力。在嵌入式软件开发领域&#xff0c;AI不仅让设备更智能&#xff0c;更在深刻改变着开发者的工作方式—…...

从零搭建AI办公助手:OpenClaw+百川2-13B-4bits七日实践计划

从零搭建AI办公助手&#xff1a;OpenClaw百川2-13B-4bits七日实践计划 1. 为什么选择这个组合&#xff1f; 去年冬天&#xff0c;当我第一次听说OpenClaw这个开源自动化框架时&#xff0c;内心是充满怀疑的。作为一个长期被各种"智能助手"忽悠的技术从业者&#xf…...

别再手动填Token了!用Knife4j的OAuth2配置,一键搞定接口文档自动化认证

告别手动Token时代&#xff1a;Knife4j与OAuth2的自动化认证实战 每次调试API都要复制粘贴Token的日子该结束了。作为后端开发者&#xff0c;我们花了大量时间在接口文档和认证流程之间来回切换——这不仅是效率问题&#xff0c;更是一种思维中断。想象一下&#xff0c;当你的微…...

掌握Nemo文件管理器:Cinnamon桌面环境的高效文件管理利器

掌握Nemo文件管理器&#xff1a;Cinnamon桌面环境的高效文件管理利器 【免费下载链接】nemo File browser for Cinnamon 项目地址: https://gitcode.com/gh_mirrors/ne/nemo Nemo作为Cinnamon桌面环境的默认文件管理器&#xff0c;不仅仅是一个简单的文件浏览器&#xf…...

BepInEx游戏插件加载器完全指南:从入门到精通Unity游戏扩展工具

BepInEx游戏插件加载器完全指南&#xff1a;从入门到精通Unity游戏扩展工具 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 如何用BepInEx解锁游戏自定义功能&#xff1f;解决玩家…...

谈谈你对springAop动态代理的理解?

面试 你要调用目标方法&#xff0c;不直接调用&#xff0c;而是交给代理对象&#xff0c;代理对象会先做额外功能&#xff0c;再调用原方法&#xff0c;最后再收尾。 至于叫动态代理的原因&#xff0c;是因为这个代理不是你手动写死的&#xff0c;而是程序在运行期间动态生成…...

高效获取数字资源工具:Internet Archive下载器全方位应用指南

高效获取数字资源工具&#xff1a;Internet Archive下载器全方位应用指南 【免费下载链接】internet_archive_downloader A chrome/firefox extension that download books from Internet Archive(archive.org) and HathiTrust Digital Library (hathitrust.org) 项目地址: h…...

「webMAN-MOD」技术探索:构建PS3主机的多功能扩展生态

「webMAN-MOD」技术探索&#xff1a;构建PS3主机的多功能扩展生态 【免费下载链接】webMAN-MOD Extended services for PS3 console (web server, ftp server, netiso, ntfs, ps3mapi, etc.) 项目地址: https://gitcode.com/gh_mirrors/we/webMAN-MOD 一、基础认知&…...