当前位置: 首页 > 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;预测正确里面有多少确实是…...

老旧Mac终极重生指南:OpenCore Legacy Patcher完整教程

老旧Mac终极重生指南&#xff1a;OpenCore Legacy Patcher完整教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款强大的开源…...

如何在VMware上运行macOS虚拟机:终极Unlocker完整指南

如何在VMware上运行macOS虚拟机&#xff1a;终极Unlocker完整指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 你是不是一直想在Windows或Linux电脑上体验macOS系统&#xff0c;却被VMware的限制挡在…...

Natron Rotoscoping与跟踪技术:专业影视特效制作终极指南

Natron Rotoscoping与跟踪技术&#xff1a;专业影视特效制作终极指南 【免费下载链接】Natron Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry. 项目地址: https://gitcode.com/gh_…...

如何快速掌握Unity游戏模组管理:5分钟终极指南

如何快速掌握Unity游戏模组管理&#xff1a;5分钟终极指南 【免费下载链接】unity-mod-manager UnityModManager 项目地址: https://gitcode.com/gh_mirrors/un/unity-mod-manager 还在为Unity游戏模组安装繁琐而烦恼吗&#xff1f;每次想为游戏添加新功能&#xff0c;却…...

Course17:SGLang 深度优化:Radix 缓存与复杂任务的极致吞吐

SGLang vs vLLMvLLM 的高并发原理&#xff1a;PagedAttention&#xff08;解决 KV Cache 碎片&#xff09;Continuous Batching&#xff08;解决 GPU 空闲&#xff09;推测解码&#xff08;加速 Decode 阶段&#xff09;> vLLM 解决的是 如何让模型跑得快 的问题。Thinking&…...

保护数字记忆:QQ空间历史说说备份工具的实用方案与技术解析

保护数字记忆&#xff1a;QQ空间历史说说备份工具的实用方案与技术解析 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 一、数字记忆的困境&#xff1a;那些正在消失的青春足迹 当你试…...

千问3.5-2B辅助MATLAB科学计算:算法实现与结果可视化脚本生成

千问3.5-2B辅助MATLAB科学计算&#xff1a;算法实现与结果可视化脚本生成 1. 科研计算的新助手 作为一名经常使用MATLAB的科研工作者&#xff0c;你是否遇到过这样的困扰&#xff1a;明明知道要解决什么数学问题&#xff0c;却卡在代码实现环节&#xff1f;或者花了大量时间调…...

如何通过 proc-macro-workshop 快速掌握 Rust 代码生成技术:终极完整指南

如何通过 proc-macro-workshop 快速掌握 Rust 代码生成技术&#xff1a;终极完整指南 【免费下载链接】proc-macro-workshop Learn to write Rust procedural macros  [Rust Latam conference, Montevideo Uruguay, March 2019] 项目地址: https://gitcode.com/gh_mirrors/…...

Project Quay镜像签名与验证:保障软件供应链安全的完整指南

Project Quay镜像签名与验证&#xff1a;保障软件供应链安全的完整指南 【免费下载链接】quay Build, Store, and Distribute your Applications and Containers 项目地址: https://gitcode.com/gh_mirrors/quay/quay 在当今云原生时代&#xff0c;容器镜像已成为软件交…...

从修车铺到世界冠军,从废塑料到再生资源:一场关于坚持与价值的时代对话

最近&#xff0c;张雪的故事刷屏了。这个14岁辍学、睡在修车铺阁楼、月薪300元的湖南山村少年&#xff0c;用了整整二十年&#xff0c;将自己亲手打造的摩托车送上了世界超级摩托车锦标赛&#xff08;WSBK&#xff09;的冠军领奖台。当五星红旗在葡萄牙阿尔加维国际赛道升起时&…...