C语言 之 浮点数在内存中的存储 详细讲解

news2024/11/15 19:36:08

文章目录

  • 浮点数
  • 浮点数的存储
  • 浮点数的存储
  • 浮点数的读取
  • 例题

浮点数

常见的浮点数:3.14159、1E10(表示1*10^10)等
浮点数家族包括: float、double、long double 类型。

浮点数表示的范围在float.h 中有定义

浮点数的存储

浮点数在计算机内部是怎么表示的呢?
根据规定,任意一个二进制浮点数V可以表示成下面的形式:
V   =  (−1)^S * M * 2^E
(−1)S 表示符号位,当S=0,V为正数;当S=1,V为负数
M 表示有效数字,M是⼤于等于1,⼩于2的
2
E 表示指数位

举例来说:
十进制的5.0,写成⼆进制形式是 101.0 ,科学计数法就相当于 1.01×2^2
那么,按照上⾯V的格式,5.0为正数,可以得出S=0,M=1.01,E=2
如果是十进制的 -5.0,写成⼆进制是 -101.0 ,相当于 -1.01×2^2
那么,S=1,M=1.01,E=2


根据规定:
对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
在这里插入图片描述
类似的
对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

浮点数的存储

这里要注意的是,首先我们前面说过, 1≤M<2,那么M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表示小数部分。
所以根据规定,在计算机内部保存M时,默认这个数的第一位是1,因此可以被舍去,只保存后⾯的xxxxxx部分。
比如要保存1.01的时候,只保存01,等到我们需要读取的时候,再把第⼀位的1加上去。这样做的⽬目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。

而对于E也有一些规定
首先我们要知道的是E是一个无符号整数,如果E为8位,它的取值范围为 0 ~ 255, 如果E为11位,它的取值范围为0 ~ 2047。但是当我们使用科学计数法的时候,E是有可能为负数的,所以根据规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
所以,当我们的E是-10的时候,存储的时候就是-10 + 127 = 117,就可以正常的使用E存储一负数了。又例如2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001,当读取的时候就将所读取的数 - 127只是存储的时候要 +127

浮点数的读取

指数E从内存中读取时可以分成三种情况:

1.E不全为0或不全为1
这时,浮点数就采⽤下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1。
比如:0.5 的⼆进制形式为0.1,(小数点后面一位,权重位2^(-1),以此类推,所以这里是1 * 2^(-1) = 0.5)由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127(中间值)=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位,00000000000000000000000,则其⼆进制表示形式为:

0 01111110 00000000000000000000000

2.E全为0
有效数字M不再加上第⼀位的1,⽽是还原为0.xxxxxx的小数,这表示一个接近于0的浮点数,正负看符号位

0 00000000 00100000000000000000000

3.E全为1
这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)

0 11111111 00010000000000000000000

例题

#include <stdio.h>
int main()
{
 int n = 9;
 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;
}

输出结果:
在这里插入图片描述

解析:
值为0.000000:
我们将9以整形的形式存储在内存中,其二进制为:0000 0000 0000 0000 0000 0000 0000 1001
首先,将 9 的⼆进制序列按照浮点数的形式拆分,得到第⼀位符号位s=0,后⾯8位的指数E=00000000 ,最后23位的有效数字M=000 0000 0000 0000 0000 1001。
由于指数E全为0,所以符合E为全0的情况。因此,浮点数V就写成:
V=(-1)^0 × 0.00000000000000000001001×2^(-126) =1.001×2^ (-146)
显然,V是⼀个很小的接近于0的正数,所以用十进制小数表示就是0.000000。

值为9.000000:
浮点数9.0 等于⼆进制的1001.0,即换算成科学计数法是:1.001×2^3
所以: 9.0 = (−1)^0 * (1.001) ∗ 2^3
所以,写成⼆进制形式,S+E+M,即

0 10000010 001 0000 0000 0000 0000 0000

这个32位的⼆进制数,被当做整数来解析的时候,就是整数在内存中的补码,符号位为0,所以是正的整数,所以补码就是原码,所以值就为1091567616

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

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

相关文章

一个证券交易系统的设计

时间&#xff1a;2024年08月25日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;https://xima.tv/1_JAlD44?_sonic0 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋内推一下&#xff0c…

墨者学院 手工注入题解(oracle数据库)

简介 Oracle 数据库系统&#xff0c;是美国ORACLE公司&#xff08;甲⻣⽂&#xff09;提供的以分布式数据库为核⼼的⼀组软件 产品。是⽬前世界上使⽤最为⼴泛的&#xff0c;数据库管理系统。 以下是手工注入的流程&#xff1a; 1、判断注入点 使用 and 11 进行拼接 2、确定…

C语言-实参和形参数据传递的特点及使用技巧

&#x1f30f;个人博客&#xff1a;尹蓝锐的博客 引言&#xff1a; 在我们介绍实参和形参数据传递的特点及使用技巧之前&#xff0c;我们先拿一个有关值传递的典型错误案例来剖析一下。 典型错误举例&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h&g…

学习笔记——TypeScript

文章目录 介绍TS增加类型支持的原因&#xff1a;安装typescript运行TS文件TS常用类型类型标注位置字符串类型、数字类型、布尔类型字面量类型interface类型class类 总结 开发阶段规范代码&#xff0c;使代码更严谨 介绍 TypeScript&#xff08;简称&#xff1a;TS&#xff09;…

《操作系统---PV操作》(同步与互斥)

一、练习题 面包师有很多面包&#xff0c;由n名销售人员推销。每名顾客进店后按序取一个号&#xff0c;并且等待叫号&#xff0c;当一名销售人员空闲时&#xff0c;就按序叫下一个号。可以用两个整型变量来记录当前的取号值和叫号值&#xff0c;试设计一个使销售人员和顾客同步…

PyTorch深度学习模型训练流程的python实现:回归

回归的流程与分类基本一致&#xff0c;只需要把评估指标改动一下就行。回归输出的是损失曲线、R^2曲线、训练集预测值与真实值折线图、测试集预测值散点图与真实值折线图。输出效果如下&#xff1a; 注意&#xff1a;预测值与真实值图像处理为按真实值排序&#xff0c;图中呈现…

聚合智链已获道富环球投资,正式上线AI合约策略资金托管平台

全球最大的托管银行之一道富环球首次进军加密货币领域&#xff0c;聚合智链获得其投资支持&#xff0c;打造出全球领先的AI合约策略资金托管平台&#xff0c;将在2024年8月 28 日正式上线。 道富环球集团的总部位于美国&#xff0c;其成立于1792年&#xff0c;是一家专注于托管…

easypoi模板导出word多页导出加强版

说明 上一篇文章提到多页导出&#xff0c;但是后边发现一个问题&#xff0c;如果用同一个模板导出多页内容&#xff0c;我们去获取多页内容的时候&#xff0c;会发现全部都一样&#xff0c;举个例子&#xff1a; XWPFDocument document WordExportUtil.exportWord07(outputU…

深度学习入门-第4章-神经网络的学习

学习就是从训练数据中自动获取最优权重参数的过程。引入损失函数这一指标&#xff0c;学习的目的是找出使损失函数达到最小的权重参数。使用函数斜率的梯度法来找这个最小值。 人工智能有两派&#xff0c;一派认为实现人工智能必须用逻辑和符号系统&#xff0c;自顶向下看问题…

java-Mybatis框架

简介 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQl、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Obje…

DFS 算法:全排列问题

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索 此系列更新频繁&…

k8s中service对象

文章目录 一、Service简介Service和kube-proxy的作用与区别Service的工作过程kube-proxy的工作过程总结 二、具体实践ClusterIPClusterIP 基本概念应用场景 NodePortNodePort 简介应用场景 ExternalName简介应用场景 一、Service 简介 Kubernetes (k8s) 中的 Service 对象是一…

使用redis设计延迟队列

目录 延迟队列概念与重要性 定义&#xff1a;延迟队列的基本概念 重要性&#xff1a;延迟队列在处理异步任务中的关键作用 图表&#xff1a;延迟队列的工作流程图 ​编辑延迟队列设计案例 背景介绍 设计目标 系统架构 设计要点 现有物理拓扑 图表&#xff1a;有赞延迟…

GStreamer 简明教程(五):Pad 相关概念介绍,Pad Capabilities/Templates

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…

自修C++Primer----3.2标准库类型string

目录 1.String的相关操作 1.1拷贝初始化&&直接初始化 1.2显示创建临时对象 1.3读取string对象内容 1.4一次读取多个未知对象 1.5使用getline读取一整行内容 1.6size()的返回值size_type类型 1.7两个string对象比较 1.8string对象赋值 1.9两个string对象相加 1…

策略产品 ①算法逻辑

目录 一、机器学习与AI的关系 二、机器学习全流程 1. 问题定义 2. 数据处理 3. 特征工程 4. 模型训练 5. 模型评估 6. 模型应用 机器学习是AI的关键技术之一&#xff0c;是指机器从历史数据中学习规律&#xff0c;从而提升系统某个性能度量的过程。这篇文章&#xff0c;我们在作…

C Primer Plus第十四章编程练习,仅供参考

第十四章编程练习 第一个问题让我们改写复习题5&#xff0c;创建一个函数去计算一年到某个月份的天数&#xff0c;在一个结构数组中去存储相关数据。完整程序代码以及运行结果如下&#xff1a; #include<stdio.h> #include<string.h> #include<ctype.h> st…

当外接硬盘接入到macOS上,只读不可写时,应当格式化

当windows磁盘格式例如 NTFS 的硬盘接入到macOS上时&#xff0c;会发现无法新建文件夹&#xff0c;无法删除、重命名。原因是磁盘格式对不上macOS&#xff0c;需要进行格式化。格式化时请注意备份重要数据。具体做法如下&#xff0c;在macOS中找到磁盘工具&#xff0c;然后对磁…

【HTML】常用几种模拟动画效果【附源代码】

1. 模拟音频波纹加载效果 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

计算机视觉编程

目录 灰色度 缩略图 拷贝粘贴区域 调整图像尺寸 旋转图像45 画图线、描点 灰色度 灰度是指图像中每个像素的亮度值&#xff0c;用来描述图像中各个像素的明暗程度。在计算机视觉中&#xff0c;灰度可以通过以下方式来计算&#xff1a; 1. 平均值法&#xff1a;将图像中每…