深入理解 C 语言中浮点型数据在内存中的存储

文章目录

  • 一、浮点型数据存储格式(IEEE 754 标准)
  • 二、举例说明单精度浮点数存储过程
  • 三、绘图说明
  • 四、双精度浮点数存储示例(以1.5为例)

在 C 语言的世界里,数据类型丰富多样,而浮点型数据用于表示实数,在科学计算、图形处理等众多领域都有着不可或缺的地位。然而,浮点型数据在内存中的存储方式相较于整型数据更为复杂,今天就让我们一同深入探索这一奥秘。

一、浮点型数据存储格式(IEEE 754 标准)

在 C 语言中,单精度浮点数(float)和双精度浮点数(double)遵循 IEEE 754 标准存储。这一标准像是一本精心编写的规则手册,确保了不同计算机系统间浮点型数据表示的一致性。
V = (−1) ∗ S M ∗ 2 E
• (−1)S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M 表⽰有效数字,M是⼤于等于1,⼩于2的
• 2 E 表⽰指数位
单精度浮点数(float)
单精度浮点数占据 4 个字节,也就是 32 位的存储空间。它被划分为三个部分:1 位符号位(S)、8 位指数位(E)和 23 位尾数位(M)。
双精度浮点数(double)
双精度浮点数则占用 8 个字节,即 64 位。同样由三部分构成:1 位符号位(S)、11 位指数位(E)和 52 位尾数位(M)。
存储规则详解
符号位(S):就像一个简单的开关,0 代表正数,1 代表负数。通过这个符号位,计算机能够轻松判断浮点型数据的正负。
指数位(E):采用偏移码表示。对于单精度浮点数,偏移量为 127;对于双精度浮点数,偏移量为 1023。实际指数e在存储时,会被转化为E = e + 127(单精度)或E = e + 1023(双精度)。例如,如果实际指数为 3,那么在单精度存储中,指数位存储的值就是3 + 127 = 130,对应的二进制为10000010。
尾数位(M):用于表示小数部分。值得注意的是,在规格化的浮点数中,小数点左边有一个隐含的 1。也就是说,在实际存储时,只保存小数点后的数字。例如,对于单精度浮点数,存储的是小数点后的 23 位数字,而在还原数值时,需要加上这个隐含的 1。

二、举例说明单精度浮点数存储过程

存储3.14(float)
转换为二进制小数:
整数部分3转换为二进制是11。
小数部分0.14的转换过程较为复杂,通过不断乘以 2 取整数部分的方法:
0.14×2 = 0.28,取整数部分 0;
0.28×2 = 0.56,取整数部分 0;
0.56×2 = 1.12,取整数部分 1;
0.12×2 = 0.24,取整数部分 0;
0.24×2 = 0.48,取整数部分 0;
0.48×2 = 0.96,取整数部分 0;
0.96×2 = 1.92,取整数部分 1…… 如此循环,得到0.14的二进制近似表示为00100011110101110000101。
组合整数和小数部分得到11.00100011110101110000101,进一步写成规格化形式为1.100100011110101110000101×2^1。
确定各部分数值:
符号位:因为3.14是正数,所以S = 0。
指数位:实际指数e = 1,存储的指数E = e + 127 = 128,二进制表示为10000000。
尾数位:去掉规格化形式小数点左边的 1,得到100100011110101110000101(23 位)。
得出内存存储形式:
所以3.14在内存中的存储形式为0 10000000 100100011110101110000101(从左到右依次为符号位、指数位、尾数位)。

三、绘图说明

假设有一个单精度浮点数(3.14),其在内存中的存储方式如下:

• 转换为二进制:

• (3.14)的二进制表示为(11.00100011110101110000101)。

• 规格化后,表示为(1.100100011110101110000101\times 2^1)。

• 确定各部分:

• 符号位:正数,为0。

• 指数位:实际指数值为1,存储的指数值为(1+127=128),二进制表示为(10000000)。

• 尾数位:小数部分为(100100011110101110000101)。

• 内存中的存储:

• 符号位:0

• 指数位:10000000

• 尾数位:100100011110101110000101

在这里插入图片描述

四、双精度浮点数存储示例(以1.5为例)

转换为二进制:整数部分是1,二进制为1;小数部分0.5×2 = 1,得到二进制为1.1,写成规格化形式为1.1×2^0。
确定各部分数值:
符号位S = 0(正数)。
实际指数e = 0,存储的指数E = e + 1023 = 1023,二进制为01111111111。
尾数位去掉隐含的 1 后为1(后面补 0 达到 52 位),即10000000000000000000000000000000000000000000000000000。
得出内存存储形式:
所以1.5在内存中的双精度存储形式为0 01111111111 1000000000000000000000000000000000000000000000000000(从左到右依次为符号位、指数位、尾数位)。
浮点型数据在内存中的存储方式虽然复杂,但它为我们在计算机中精确表示和处理实数提供了可能。通过深入理解这一存储方式,我们能够更好地优化代码,避免因浮点数运算带来的精度问题。希望这篇博客能帮助大家在 C 语言的学习中,对浮点型数据的存储有更清晰的认识。

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

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

相关文章

hutool糊涂工具通过注解设置excel宽度

import java.lang.annotation.*;Documented Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) public interface ExcelStyle {int width() default 0; }/*** 聊天记录*/ Data public class DialogContentInfo {/**…

自定义日期转换配置

文章目录 1.日期问题出现原因以及解决方案概述1.图示2.三种解决方案概述1.对于表单数据 application/x-www-form-urlencoded2.对于JSON数据1.使用JsonFormat注解2.自定义Jackson日期转换配置 2.解决方案common-web-starter1.目录2.BaseController.java 使用InitBinder解决表单数…

Ubuntu更改内核

需求背景: 由于软件需要在较低版本或者指定版本才可以运行 版本: 配置文件: vi /etc/default/grub 启动界面: 可运行版本: 解决方案: 方案1、更改启动顺序 sudo vi /etc/default/grub 方案2、调整启动顺…

Android系统定制APP开发_如何对应用进行系统签名

前言 当项目开发需要使用系统级别权限或frame层某些api时,普通应用是无法使用的,需要在AndroidManifest中配置sharedUserId: AndroidManifest.xml中的android:sharedUserId“android.uid.system”,代表的意思是和系统相同的uid&a…

解决idea中无法拖动tab标签页的问题

1、按 Ctrl Alt S 打开设置,找到路径 File | Settings | Appearance & Behavior | Appearance 2、去掉勾选 Drag-and-drop with Alt pressed only 即可

【芯片封测学习专栏 -- D2D 和 C2C 之间的区别】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewD2D(Die-to-Die)互联D2D 定义D2D 特点D2D 使用场景 C2C(Chip-to-Chip)互联C2C 定义C2C 特点C2C 使…

SQL美化器优化

文章目录 1.目录2.代码 1.目录 2.代码 package com.sunxiansheng.mybatis.plus.inteceptor;import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.*; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.*…

CC工具箱使用指南:【类Json文本转面要素】

一、简介 有一些面要素是通过Json数据存储的,但有可能在某些转化过后,变成了文本信息存储在字段里,如下截图: 字段值中保存了完整的点坐标信息。 工具要做的是将这点坐标信息提取出来,创建成面要素。 二、工具参数介…

英伟达Project Digits赋能医疗大模型:创新应用与未来展望

英伟达Project Digits赋能医疗大模型:创新应用与未来展望 一、引言 1.1 研究背景与意义 在当今数字化时代,医疗行业作为关乎国计民生的关键领域,正面临着前所未有的挑战与机遇。一方面,传统医疗模式在应对海量医疗数据的处理、复…

力扣 岛屿数量

从某个点找,不断找相邻位置。 题目 岛屿中被“0”隔开后 ,是每一小块状的“1”,本题在问有多少块。可以用dfs进行搜索,遍历每一个点,把每一个点的上下左右做搜索检测,当检测到就标记为“0”表示已访问过&a…

An FPGA-based SoC System——RISC-V On PYNQ项目复现

本文参考: 👉 1️⃣ 原始工程 👉 2️⃣ 原始工程复现教程 👉 3️⃣ RISCV工具链安装教程 1.准备工作 👇下面以LOCATION代表本地源存储库的安装目录,以home/xilinx代表在PYNQ-Z2开发板上的目录 ❗ 下载Vivad…

Windows下调试Dify相关组件(2)--后端Api

1.部署依赖的服务(代码最外层的docker目录) 1.1 将middleware.env.example复制,并改名为middleware.env。 1.2 查看docker-compose.middleware.yaml,有5个服务 db:postgres数据库。 redis:redis缓存。 sa…

CSS | CSS实现两栏布局(左边定宽 右边自适应,左右成比自适应)

目录 一、左边定宽 右边自适应 1.浮动 2.利用浮动margin 3.定位margin 4.flex布局 5.table 布局 二、左右成比自适应 1:1 1flex布局 table布局 1:2 flex布局 <div class"father"><div class"left">左边自适应</div><div class"r…

Spring Framework 5.3.x源码构建 (jdk-1.8, gradle 7.5.1, idea2024.3)

1、下载jdk安装并配置环境变量&#xff08;自行百度&#xff09; https://www.oracle.com/java/technologies/downloads/#java8 2、下载spring-framework源码&#xff0c;切换分支到5.3.x https://github.com/spring-projects/spring-framework.git 备用地址 https://gitco…

合洁科技电子洁净工程公司分享晶圆厂百级净化车间建设的关键要点

电子厂百级净化车间的设计装修是一个复杂而精细的过程&#xff0c;它直接关系到电子产品的生产质量、员工的健康安全以及生产环境的稳定性。为了满足高洁净度、低污染的生产要求&#xff0c;设计装修过程中需要综合考虑多个方面的因素。以下是合洁科技电子净化工程公司对电子厂…

CentOS7下Spark-2.4.3-bin-without-hadoop版本安装详细图文教程

1、该Spark版本说明 1、依赖关系 该版本不包含Hadoop的依赖库。适用于那些不直接需要Hadoop集群或者已经通过其他方式管理Hadoop依赖的用户。用户可以在不依赖Hadoop的环境中运行Spark&#xff0c;或者如果已有一个Hadoop环境但希望使用Spark自带的Hadoop客户端库&#xff0c;…

论文解析 | 基于语言模型的自主代理调查

论文 《A Survey on Large Language Model-based Autonomous Agents》 对基于大型语言模型&#xff08;LLM&#xff09;的自主智能体&#xff08;Autonomous Agents&#xff09;进行了全面调查。随着大型语言模型&#xff08;如 GPT 系列、BERT、T5 等&#xff09;的快速发展&a…

【DB-GPT】开启数据库交互新篇章的技术探索与实践

一、引言&#xff1a;AI原生数据应用开发的挑战与机遇 在数字化转型的浪潮中&#xff0c;企业对于智能化应用的需求日益增长。然而&#xff0c;传统的数据应用开发方式面临着诸多挑战&#xff0c;如技术栈复杂、开发周期长、成本高昂、难以维护等。这些问题限制了智能化应用的…

centos9设置静态ip

CentOS 9 默认使用 NetworkManager 管理网络&#xff0c;而nmcli是 NetworkManager 命令行接口的缩写&#xff0c;是一个用来进行网络配置、管理网络连接的命令工具&#xff0c;可以简化网络设置&#xff0c;尤其是在无头&#xff08;没有图形界面&#xff09;环境下。 1、 cd…

单片机(MCU)-简单认识

简介&#xff1a; 内部集成了CPU&#xff0c;RAM&#xff0c;ROM&#xff0c;定时器&#xff0c;中断系统&#xff0c;通讯接口等一系列电脑的常用硬件功能。 单片机的任务是信息采集&#xff08;依靠传感器&#xff09;&#xff0c;处理&#xff08;依靠CPU&#xff09;&…