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

news2025/1/13 14:30:36

文章目录

  • 一、浮点型数据存储格式(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.coloradmin.cn/o/2276001.html

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

相关文章

使用uniapp 微信小程序一些好用的插件分享

总结一下自己在开发中遇见的一问题,通过引入组件可以快速的解决 1.zxz-uni-data-select 下拉框选择器(添加下拉框检索,多选功能,多选搜索功能,自定义 下拉框插件,使用这个的原因是因为 uniui uview 组件库下拉框太…

kafka消费堆积问题探索

背景 我们的商城项目用PHP写的,原本写日志方案用的是PHP的方案,但是,这个方案导致资源消耗一直降不下来,使用了20个CPU。后面考虑使用通过kafka的方案写日志,商城中把产生的日志丢到kafka中,在以go写的项目…

使用conda出现requests.exceptions.HTTPError 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

智能化文档开发(DI)

这个文档涉及到多模态(文本、发票、订单、语音) 对于普通的文本,我们希望对某些实体的某些属性挖空生成文档模版,并根据预设字段填空最后生成正式文件对于发票、订单,我们想提取它的字段信息,写入DB对于一些…

RAID储存技术

RAID独立磁盘冗余技术是一种把2个或者多个HDD或SSD合并为一个协调的存储单元或列阵,从而预防数据丢失的技术,其最早由加州大学伯克利分校的计算机科学家David Patterson、Garth Gibson和Randy Katz在1987年提出。他们的研究论文“关于RAID的论证”提出了…

Java Web开发基础:HTML的深度解析与应用

文章目录 前言🌍一.B/S 软件开发架构简述🌍二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 🌍三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…

使用 WPF 和 C# 绘制图形

绘图困难 此示例展示了如何在 WPF 和 C# 中绘制图形。绘制图形总是很棘手,因为您通常需要在至少两个不同的坐标系中工作。首先,您要为图形使用世界坐标。例如,您可能希望 X 值的范围为 2000 年至 2020 年,Y 值的范围为 10,000 美元…

年度技术突破奖|中兴微电子引领汽车芯片新变革

随着以中央计算区域控制为代表的新一代整车电子架构逐步成为行业主流,车企在电动化与智能化之后,正迎来以架构创新为核心的新一轮技术竞争。中央计算SoC,作为支撑智驾和智舱高算力需求的核心组件,已成为汽车电子市场的重要新增量。…

【JVM-2.3】深入解析JVisualVM:Java性能监控与调优利器

在Java应用的开发和运维过程中,性能监控与调优是不可或缺的环节。无论是排查内存泄漏、分析CPU瓶颈,还是优化线程使用,开发者都需要借助一些强大的工具来辅助诊断。JVisualVM 正是这样一款由Oracle提供的免费工具,它集成了多种性能…

filestream安装使用全套+filebeat的模块用法

1 filestream介绍 官方宣布:输入类型为log在filebeat7.16版本已经弃用了 Filestream 是 Filebeat 中的一种 输入类型(Input),用于处理日志文件的读取。它是为了取代 Filebeat 中传统的 log 输入(Input)设…

超燃预告!Origin百图绘制系列即将登场

Hello,大家好 这里是练习时长两年半的菜狗~ 持续更新各种竞赛,科研,保研,学习干货ing 回想刚开始打比赛那会,啥都不懂,就从用 Excel 画图起步,绘制的图形实在太难看。后来运用 Matlab&#xf…

八、系统托盘与配置面板

没有人会把你变得越来越好,时间和经历只是陪衬。 支撑你变得越来越好的,是你自己坚强的意志、修养、品行、以及不断的反思和经验。 人生最好的贵人,就是努力向上的自己。 一、系统托盘 1、资源文件夹 新建资源文件夹,我们需要把…

uniapp 之 uni-forms校验提示【提交的字段[‘xxx‘]在数据库中并不存在】解决方案

目录 场景问题代码结果问题剖析解决方案 场景 uni-forms官方组件地址 使用uniapp官方提供的组件,某个表单需求,单位性质字段如果是高校,那么工作单位则是高校的下拉选择格式,单位性质如果是其他的类型,工作单位则是手动…

Java面试核心知识4

公平锁与非公平锁 公平锁(Fair) 加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得 非公平锁(Nonfair) 加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾…

基于 SSH 的任务调度系统

文末附有完整项目代码 在当今科技飞速发展的时代,任务调度系统的重要性日益凸显。本文将详细介绍一个基于 SSH(SpringStruts2Hibernate)的任务调度系统的设计与实现。 一、系统概述 本系统旨在改变传统人工任务调度方式,通过计算…

我的128天创作之路:回顾与展望

大家好呀!今天来和你们分享一下我的创作历程😁。 一、机缘 最开始创作呢,是因为在学习 C 的 STL 时,像 string、list、vector 这些模板可把我折腾得够呛,但也让我学到了超多东西!我就想,要是把我…

性能测试工具Jmeter中的FTP脚本开发

FTP文件传输协议是TCP/IP协议组织中的常用协议之一,主要用在internet上双向传输文件。FTP协议具有客户端和服务器端两个部分组成部分,具有上传与下载两种功能。Jmeter也提供了FTP请求的测试支持,实现了上传和下载功能测试。 对于上图的FTP请求…

【C++】string的关系运算与比较分析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯基础知识:C 中的 string 关系运算器1. 关系运算器概述2. 字符串比较的本质 💯代码解析与扩展代码例一:相等比较代码解析输出 代码例二&a…

mysql本地安装和pycharm链接数据库操作

MySQL本地安装和相关操作 Python相关:基础、函数、数据类型、面向、模块。 前端开发:HTML、CSS、JavaScript、jQuery。【静态页面】 Java前端; Python前端; Go前端 -> 【动态页面】直观: 静态,写死了…

深度学习|表示学习|一个神经元可以干什么|02

如是我闻: 如果我们只有一个神经元(即一个单一的线性或非线性函数),仍然可以完成一些简单的任务。以下是一个神经元可以实现的功能和应用: 1. 实现简单的线性分类 输入:一组特征向量 x x x 输出&#xff…