数据在内存中的存储(2)——浮点数

news2024/11/25 2:51:12

目录

1、什么是浮点数

2、浮点数与整数存储方式相同吗?

3、浮点数的存储规则

        3.1 、国际标准IEEE(电气和电子工程协会) 754

        3.2、IEEE 754规定:

        3.3、IEEE 754对有效数字M的规定。

        3.4、IEE 754对有效数字E的规定

        E不全为0或不全为1

        E全为0

        E全为1

4、解释前面的题目


1、什么是浮点数

首先,我们需要理解什么是浮点数?

之前我们学习了定点数,其中「定点」指的是约定小数点位置固定不变。那浮点数的「浮点」就是指,其小数点的位置是可以是漂浮不定的。

这怎么理解呢?

其实,浮点数是采用科学计数法的方式来表示的,例如十进制小数 8.345,用科学计数法表示,可以有多种方式:

8.345 = 8.345 * 10^0
8.345 = 83.45 * 10^-1
8.345 = 834.5 * 10^-2
...

看到了吗?用这种科学计数法的方式表示小数时,小数点的位置就变得「漂浮不定」了,这就是浮点数名字的由来。

使用同样的规则,对于二进制数,我们也可以用科学计数法表示,也就是说把基数 10 换成 2 即可。

2、浮点数与整数存储方式相同吗?

博主特意将浮点数与整数分开讲,那么说明肯定是不同的

这里博主为大家引入一个例子,看看是否真的不同,请看以下代码

int main()
{
 int n = 9;
 float *pFloat = (float *)&n;//将n的地址取出强制类型转换为float*,然后再赋给*pFloat
 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;
}

这里博主想让各位先试一下自己猜测一下结果为多少,我相信大多数都会猜测为

n的值为:9

*pFloat的值为:9.000000

num的值为:9

*pFloat的值为:9.000000

因为这是我们前面所讲的整数的存储思维,那这样的结果对吗?我们来看一下运行结果

我们发现,和我们猜想得值不一样,那这说明一个什么问题呢?

说明浮点数与整数得存储方式并不相同,接下来我们一起来看看浮点数再内存中是如何存储的

3、浮点数的存储规则

        3.1 、国际标准IEEE(电气和电子工程协会) 754

根据国际标准 IEEE (电气和电子工程协会) 754 ,任意一个二进制浮点数 V 可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^S 表示符号位,当 S=0 V 为正数;当 S=1 V 为负数。
M 表示有效数字,大于等于 1 ,小于 2
2^E 表示指数位。

我们已经知道,浮点数是采用科学计数法来表示一个数字的,它的格式可以写成这样:

V = (-1)^S * M * R^E

其中各个变量的含义如下:

  • S:符号位,取值 0 或 1,决定一个数字的符号,0 表示正,1 表示负
  • M:尾数,用小数表示,例如前面所看到的 8.345 * 10^0,8.345 就是尾数
  • R:基数,表示十进制数 R 就是 10,表示二进制数 R 就是 2
  • E:指数,用整数表示,例如前面看到的 10^-1,-1 即是指数
举例来说:
十进制的 5.0 ,写成二进制是 101.0 ,相当于 1.01×2^2
那么,按照上面 V 的格式,可以得出 S=0 M=1.01 E=2
十进制的 -5.0 ,写成二进制是 - 101.0 ,相当于 - 1.01×2^2 。那么, S=1 M=1.01 E=2

        3.2、IEEE 754规定:

对于 32 位的浮点数,最高的 1 位是符号位 S ,接着的 8 位是指数 E ,剩下的 23 位为有效数字 M
  • 符号位 S 占 1 bit
  • 指数 E 占 10 bit
  • 尾数 M 占 21 bit
对于 64 位的浮点数,最高的 1 位是符号位S,接着的 11 位是指数 E ,剩下的 52 位为有效数字 M

  • 符号位 S 占 1 bit
  • 指数 E 占 11 bit
  • 尾数 M 占 52 bit

        3.3、IEEE 754对有效数字M的规定。

前面说过, 1≤M<2 ,也就是说, M 可以写成 1.xxxxxx 的形式,其中 xxxxxx 表示小数部分。
IEEE 754 规定,在计算机内部保存 M 时,默认这个数的第一位总是 1 ,因此可以被舍去,只保存后面的
xxxxxx 部分。比如保存 1.01 的时
候,只保存 01 ,等到读取的时候,再把第一位的 1 加上去。这样做的目的,是节省 1 位有效数字。以 32
浮点数为例,留给 M 只有 23 位,
将第一位的 1 舍去以后,等于可以保存 24 位有效数字。

        3.4、IEE 754对有效数字E的规定

首先, E 为一个无符号整数( unsigned int
这意味着,如果 E 8 位,它的取值范围为 0~255 ;如果 E 11 位,它的取值范围为 0~2047 。但是,我们
知道,科学计数法中的 E 是可以出 现负数的,例如0.5
十进制:0.5
二进制:0.1
0.5=(-1)^0*1.0*2^(-1)
S:0
M:1.0
E:-1

所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数

127 ;对于 11 位的 E ,这个 中间 数 是1023 。比如, 2^10 E 10 ,所以保存成 32 位浮点数时
必须保存成 10+127=137 ,即 10001001。
然后,指数 E 从内存中取出还可以再分成三种情况:

E不全为0或不全为1

这时,浮点数就采用下面的规则表示,即指数 E 的计算值减去 127 (或 1023 ),得到真实值,再将
有效数字 M 前加上第一位的 1
比如:
0.5 1/2 )的二进制形式为 0.1 ,由于规定正数部分必须为 1 ,即将小数点右移 1 位,则为
1.0*2^(-1) ,其阶码为 -1+127=126 ,表示为
01111110 ,而尾数 1.0 去掉整数部分为 0 ,补齐 0 23 00000000000000000000000 ,则其二进
制表示形式为 :

E全为0

这时,浮点数的指数 E 等于 1-127 (或者 1-1023 )即为真实值,
有效数字 M 不再加上第一位的 1 ,而是还原为 0.xxxxxx 的小数。这样做是为了表示 ±0 ,以及接近于
0 的很小的数字。
SEM
0 0111111000000000000000000000000

E全为1

这时,如果有效数字 M 全为 0 ,表示 ± 无穷大(正负取决于符号位 s );
好了,关于浮点数的表示规则,就说到这里。

4、解释前面的题目

为什么 0x00000009 还原成浮点数,就成了 0.000000
首先,将 0x00000009 拆分,得到第一位符号位 s=0 ,后面 8 位的指数 E=00000000
最后 23 位的有效数字 M=000 0000 0000 0000 0000 1001。
由于指数 E 全为 0 ,所以符合上一节的第二种情况。因此,浮点数 V 就写成:
   V=( - 1)^0 × 0.00000000000000000001001×2^( - 126)=1.001×2^( - 146)
显然, V 是一个很小的接近于 0 的正数,所以用十进制小数表示就是 0.000000 。代码解释如下
#include <stdio.h>
//
//int main()
//{
//	int n = 9;
//	//
//	//0 00000000 00000000000000000001001
//	//S  E        M
//	//0  -126     0.00000000000000000001001
//	//(-1)^0 * 0.00000000000000000001001 * 2^-126
//	//
//	//E在内存中是全0
//	//
//	float* pFloat = (float*)&n;
//
//	printf("n的值为:%d\n", n);//9
//	printf("*pFloat的值为:%f\n", *pFloat);//0.000000
//
再看例题的第二部分。
请问浮点数 9.0 ,如何用二进制表示?还原成十进制又是多少?
首先,浮点数 9.0 等于二进制的 1001.0 ,即 1.001×2^3
那么,第一位的符号位 s=0 ,有效数字 M 等于 001 后面再加 20 0 ,凑满 23 位,指数 E 等于 3+127=130 , 即10000010
所以,写成二进制形式,应该是 s+E+M ,即 这个32 位的二进制数,还原成十进制,正是 1091567616 。代码解释如下
//	*pFloat = 9.0;
//	//1001.0
//	//1.001 * 2^3
//	//(-1)^0 * 1.001 * 2^3
//	//S=0     E=3  M=1.001
//	//0 10000010 00100000000000000000000
//	//
//	printf("num的值为:%d\n", n);//1091567616
//	printf("*pFloat的值为:%f\n", *pFloat);//9.0
//
//	return 0;
//}

最后再给宝子们一个单双精度浮点数的对比,加深一下理解 

制作不易,你的三连就是博主最大的动力!!! 

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

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

相关文章

Day58【单调栈】739.每日温度、496.下一个更大元素 I

739.每日温度 力扣题目链接/文章讲解 视频讲解 暴力解法很容易想到。外层 for 遍历填充 answer&#xff0c;内层 for 针对每一天去寻找下一个更高温度 直接超时 本题可以采用单调栈解决&#xff01; 什么是单调栈&#xff1f; 从名字上就听的出来&#xff0c;单调栈中…

创建型设计模式05-抽象工厂模式

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 抽象工厂模式 1、抽象工厂模式介绍 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#x…

MATLAB按照曲线模型拟合数据

用到了曲线拟合工具箱&#xff0c;如果没有下载需要另外安装&#xff1a; 没有下载的话在命令行内输入cftool不会弹出窗口&#xff0c;而是提示没有这个命令 在菜单栏的APP&#xff1a; 点击获取更多APP&#xff1a; 在弹出的窗口输入Curve Fitting Toolbox 注意这里输入cft…

100种思维模型之多维视角思维模型-70

“多维视角思维模型”让我们用众生之眼看世界&#xff0c;继而看见更真实世界的思维模型。 01、何谓多维度视角思维模型 一、多维度视角 所谓多维视角&#xff0c;指的是除了用自己本能的视角看待问题&#xff0c;还会用360度其他人的视角&#xff0c;如对立面的视角&#xff…

仅用自然语言,让ChatGPT输出连贯的长篇小说!苏黎世联邦理工大学提出RecurrentGPT

夕小瑶科技说 原创 作者 | ZenMoore&#xff0c;Wangchunshu Zhou 前言 ChatGPT 是万能的吗&#xff1f; 显然不是&#xff0c;至少在今天我们所讨论的长文本生成上&#xff0c;ChatGPT 可以说是几乎完全不太可能生成长篇小说。 在某种程度上&#xff0c;这是 Transformer 模…

2自由度并联关节的制作

1. 运动功能说明 2自由度并联关节模组的主要运动方式为用舵机带动连杆摆动。 2. 结构说明 构成本模组的零部件主要是舵机&#xff08;行程0度~180度&#xff09;、舵机支架、舵机输出头、连杆、螺丝、螺母等。此模组的机械系统介绍及运动学算法讲解可参考【R306】5自由度并联机…

回收站不见了怎么恢复?3个方法快速解决!

案例&#xff1a;我想把需要删除的软件拖到桌面回收站中进行删除&#xff0c;却发现我电脑桌面上的回收站不见了&#xff0c;有小伙伴知道怎么恢复吗&#xff1f; 在日常使用电脑的过程中&#xff0c;回收站是一个至关重要的功能。当我们删除文件时&#xff0c;它提供了一个安…

git 远端分支管理、仓库迁移:017

1. 在Github上创建分支&#xff1a; 2. 在Github上删除分支&#xff1a; 3. 使用命令来删除远端分支&#xff1a; 如果远端分支发生改变&#xff0c; 需要通过git pull来获取远端最新分支&#xff0c;如下图&#xff0c;就可以看到获取到了最新分支&#xff1a; 查看本地分支和…

springboot+vue新闻稿件java在线投稿管理系统

本文介绍了新闻稿件管理系统的开发全过程。通过分析新闻稿件管理系统管理的不足&#xff0c;创建了一个计算机管理新闻稿件管理系统的方案。文章介绍了新闻稿件管理系统的系统分析部分&#xff0c;包括可行性分析等&#xff0c;系统设计部分主要介绍了系统功能设计和数据库设计…

数据库整理

文章目录 1、将Excel转换为CSV1.1 代码 2、将CSV文件的数据追加到另一个CSV文件2.1 代码 3 、另外的发现 背景&#xff1a;在数据库里面导出来一批excel文件&#xff0c;现在需要将这些数据进行合并为csv文件 分两步&#xff1a; 1、将Excel转换为CSV 参考&#xff1a;用Pytho…

如何使用宝塔面板搭建网站(搭建宝塔页面)

书接上回&#xff0c;咱们已经搭建好咱们的Linux服务器&#xff0c;接下来改是搭建宝塔页面的教程了。 这里我们需要一个域名&#xff0c;自行去各家云服务器购买域名&#xff08;例如&#xff1a;腾讯云&#xff0c;阿里云&#xff0c;华为云等等&#xff09; 购买一个域名之…

FPGA纯vhdl实现XGMII接口10G万兆网UDP协议DMA传输 配合10G Ethernet PCS/PMA使用 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案传统UDP网络通信方案本方案详细设计说明DMA和BRAMAXIS-FIFO10G-UDP协议栈10G Ethernet PCS/PMA IP核输出 4、vivado工程详解Block Design设计SDK设计 5、上板调试验证并演示6、福利&#xff1a;工程代码的获取 1、前言 目前…

【ChatGPT】开发人员教程:38 种提高 10 倍工作效率的方法(附Youtube视频地址)...

1. 推荐3本顶级的学习xx的书籍 2. 询问细节&#xff1a;“Head first Java”的主要内容是什么&#xff1f;What are the key takeaways from "Head first Java"? 3. 我如何成为一名前端开发人员&#xff1f;How do I become a front-end developer? &#xff08;英…

JVM-常用工具(jps、jstat、jinfo、jmap、jhat、jstack、jconsole、jvisualvm)使用

场景 记录JVM中常用工具。 jps:虚拟机进程状态工具 jps(JVM Process Status Tool)&#xff1a;虚拟机进程状态工具&#xff0c;可以列出正在运行的虚拟机进程&#xff0c; 并显示虚拟机执行主类&#xff08;Main Class&#xff0c;main()函数所在的类&#xff09;的名称&am…

【Mininet】安装篇:安装Mininet

大家好&#xff0c;我是皮皮猫吖&#xff01; 每文一言&#xff1a;改变你的生活&#xff0c;现在或者从不 本篇文章&#xff1a; 本文是安装 mininet 的简单过程。 正文如下&#xff1a; 一、Mininet的安装 第一步&#xff1a;安装git apt install git 第二步&#xff…

element-ui配置按需引入和全局引入

镇楼图 按需引入 安装element-plus cnpm install element-plus --save 安装按需导入 cnpm install -D unplugin-vue-components unplugin-auto-import修改vite.config.js配置按需加载 import AutoImport from unplugin-auto-import/viteimport Components from unplugin-vue-…

30天从入门到精通TensorFlow1.x第一天,如何创建张量

文章目录 一、TensorFlow基本概念1. 什么是TensorFlow2. TensorFlow的组成3. TensorFlow的三个重要模型 二、TensorFlow的重要底层库1. 先简单来个 helloWord2. 张量什么是张量如何创建张量创建张量&#xff08;1&#xff09;. 通过定义常量来进行创建张量&#xff08;2&#x…

Java学习笔记21——常用API

常用API 常用APIMath类Math的常用方法 System类System类常用方法 Object类Object类常用方法 Arrays类Arrays常用方法 基本类型包装类Integer类的概述和使用int和String的相互转换自动装箱和拆箱 日期类Date类Date类的常用方法 SimpleDateFormat类SimpleDateFormat的构造方法Sim…

【计算机网络实验】静态路由协议和RIP协议仿真实验

实验内容  静态路由协议和RIP协议仿真实验 实验目的 1 路由器及路由协议基础知识 2 静态路由配置实验 &#xff08;1&#xff09;掌握静态路由和RIP的配置方法&#xff1b; &#xff08;2&#xff09;掌握通过静态路由和RIP方式实现网络的连通性&#xff1b; &#xff08;3…

什么是品牌推广?品牌推广的基本概念及注意要点

品牌推广是企业进行营销活动的关键之一&#xff0c;而现代市场竞争激烈&#xff0c;如何进行有效的品牌推广也成为企业最为关心的问题之一。本文将为大家介绍品牌推广的基本概念、策略以及注意事项。 一、品牌推广的基本概念 品牌推广是指企业通过多种手段&#xff0c;以宣传产…