数据在内存的存储(2)【浮点数在内存的存储】

一.浮点数以什么形式存储在内存中

根据根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V都可以存储为这样的形式:

V=(-1)^S*M*2^E。

(1)(-1)^S表示符号位,当S为0时,V为正数;S为1时是负数。

(2)M表示有效数字,M是大于等于1,小于2的

(3)2^E表示指数位。

举个例子:比如5.0,写成二进制是101.0,相当于1.01*2^2。则S=0,M=1.01,E=2.

                  比如-5.0,相当于-1.01*2^2。则S=1,M=1.01,E=2.

                  再比如5.5,二进制是101.1,所以为1.011*2^2.则S=0,M=1.011,E=2.

IEEE 754规定:

对于32位的浮点数(float),最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M.

对于64位的浮点数(double),最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M.

这就是关于浮点数在内存中最基础的存储。

二.浮点数存的过程

前面我们说,M我们可以写成1.xxxxx的形式,其中xxxxx是小数部分。当我们保存M的时候,默认这个数的第一位总是1。因此我们可以把这个1舍去,只保存后面的xxxxxx。比如我们存储1.011的时候,只保存011,等到读取的时候,再把第一位的1加上去。这样我们就可以节省出1位有效数字,就像是M本来只能储存23位,但是省去了第一位后,相当于我们最多可以存储24位。

关于E的存储,就有些复杂了,首先它必须是一个无符号的整数。假如E为8位,它的取值范围就是0~255,如果为11,就是0~2047。但是我们知道,这个是指数,科学计数法里是可以出现负数的,所以IEEE 754规定,存入内存的E必须加上一个中间数,对于8位的E,中间数就是127。11位的就是1023.比如,2^10,我们保存成32位时,我们需要保存成137,也就是10001001。

大家注意,float类型是有最大值和最小值的。所以我们的E肯定也是有最大值和最小值的。不过我们不用担心我们加上127或者1023会超出这个范围。

来给大家举个例子

至于为什么是反过来的,可以看我上一篇博客,关于大小端存储的内容。

注意这里我举的例子是5.5在内存中可以精确保存的,但是像是3.14,1.1等等这些数字,是无法再内存中精确保存的。因为我们数据是以二进制存储的,小数点后面是2^-1,2^-2等等,这样的数据对于32位的float是无法精确保存的。

三.浮点数取的过程

1.E不全为1或不全为0

比如0.5的存储

0 01111110 0000000000000000000000

这个最好理解,当我们把存入内存的数据取出来的时候,先把指数E减去127或者1023,得到真实值,再将有效数字M前加上第一位的1(因为我们在存的时候不是把这个省去了吗)。整体的步骤实际上就是把我们存进去的时候完全反了过来。

2.E全为0

0 00000000 00100000000000000000000

这是一种特殊情况,这个时候的E等于1-127或者1-1023这个就是真实值,有效数字M不再加上第一位的1,而是还原成0.xxxxxx的小数。这样做是为了表示±0,以及接近0的很小的数字。

3.E全为1

0 11111111 00100000000000000000000

这个也是一个特殊情况,这里我们有八个1,表示的十进制数是255,大家可以想想,因为我们是加完127之后得到的这个数字,那么真实值就是255-127=128。那么也就是说,这个数字是2^128这是一个天文数字。所以它就表示的是正负无穷大的数字。

四.练习

来看一下这四个输出的是什么结果。

#include<stdio.h>
int main()
{int a = 9;float* pfloat = (float*)&a;printf("a=%d\n", a);printf("*ploat=%f\n", *pfloat);*pfloat = 9.0;printf("a=%d\n", a);printf("*ploat=%f", *pfloat);return 0;
}

这个就要用到我刚才写的那些内容了。

第一个printf就不用多说,输出的肯定是9。

第二个值是几呢?9的二进制是1001,补成32位之后是00000000000000000000000000001001,这里我们把a的地址取出来,因为&a的类型是int*所以这里肯定要强制转换成float*。此时的pfloat指向的就是一个float*类型的a。站在pfloat的角度,它会认为自己指向的是一个float的类型。所以这里的32位就会被理解成是用浮点数存储的方式。也就是

0 00000000 00000000000000000001001

这种情况就是我们上面说的E为全0的特殊情况。E的值就是-126,有效数字M也不再加上第一位的1.所以这里就是(-1)*0.00000000000000000001001*2^-126这个值就直接约等于0了。

第二个打印出来结果:0.000000

第三个的结果我们是把浮点数类型的9.0用%d打印出来,其实只要理解了第二个这一个也不算难了。回想一下浮点数在内存的存储。9.0的二进制是1001.0也就是(-1)^01.001*2^3.S=0,E=3,M=1.001。所以0 10000010 00100000000000000000000这个就是9.0在内存的存储。但是这里打印的是用%d打印,认为内存里的是有符号说,所以这里的最高位0代表的就是正。而正数的原码,反码和补码都是一样的。所以我们就按照这个原码来打印出来。

第三个打印出来的结果:1,091,567,616

这那么最后一个打印出来的这个就是以浮点数的形式打印的,所以就是9.000000

好了,到这里就把数据在内存中的存储就全部讲完了。感谢大家的观看,如有错误,请大家多多指出。

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

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

相关文章

[免费]通义灵码做活动,送礼品,快来薅羊毛!!!

你的编辑器装上智能ai编辑了吗&#xff0c;的确挺好用的。 最近阿里云AI编码搞活动&#xff0c;可以免费体验并且还可以抽盲盒。有日历、马克杯、代金券、等等其他数码产品。 大多数都是日历。 点击链接参与「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」 https://develope…

蓝桥杯2023真题-幸运数字

目录 进制转换&#xff1a; 思路 代码 题目链接&#xff1a; 0幸运数字 - 蓝桥云课 (lanqiao.cn) 本题就考的进制转换问题&#xff0c;要将十进制5转换成二进制&#xff0c;通过%2,和/2的交替使用即可完成&#xff0c;所得余数就是转换成的二进制各位的值&#xff0c;转换…

SQLAlchemy操作数据库

数据库是一个网站的基础。 比如 MySQL 、 MongoDB 、 SQLite 、 PostgreSQL 等&#xff0c;这里我们以 MySQL为例进行讲解。 SQLAlchemy 是一个 ORM 框架 我们会以 MySQL SQLAlchemy 组合进行讲解。 在操作数据库操作之前&#xff0c;先确保你已经安装了以下两个插件&#…

继承-练习

T3、编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。可以弹奏的乐器包括二胡、钢琴和琵琶。要求&#xff1a; 定义乐器类Instrument&#xff0c;包括方法makeSound()定义乐器类的子类&#xff1a;二胡Erhu、钢琴Piano和小提琴Violin定义乐手类Musician&…

使用RN输入验证码(四个输入框)

先安装 yarn add react-native-confirmation-code-fieldRN代码 import React, { useState } from react; import { SafeAreaView, Text, StyleSheet, Dimensions } from react-native;import { CodeField, Cursor } from react-native-confirmation-code-field; const width …

Aurora IP的Framing帧接口和Streaming流接口

本文介绍Aurora IP配置时要选择的接口类型以及两种接口类型之前的区别。 Aurora IP接口有两种模式&#xff1a;Framing帧接口&#xff0c;Streaming流接口 目前一直在用的都是Framing帧接口。 Framing帧接口和Streaming流接口的主要区别是什么呢&#xff1f; 顾名思义&#x…

国内用户掌握ChatGPT,你已超越万人!

在数字时代&#xff0c;掌握前沿技术往往意味着拥有更多的机遇和可能。ChatGPT&#xff0c;作为当前最热门的人工智能技术之一&#xff0c;已经证明了其在各个领域的广泛应用价值。但在中国&#xff0c;能熟练使用ChatGPT的人究竟领先了多少人&#xff1f;让我们深入探讨。>…

【Git】日志功能

1. git日志显示 # 显示前3条日志 git log -3# 单行显示 git log --oneline# 图表日志 git log --graph# 显示更改摘要 git log --stat# 显示更改位置 git log --patch 或 git log -p# 查看指定文件的提交历史记录 git log {filename}例子1&#xff1a;单行显示 例子2&#xff…

2024年最新阿里云服务器价格表_CPU内存+磁盘+带宽价格

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

ManageEngine EventLog Analyzer: 功能丰富的日志分析工具

来自 Zoho Corp. 的 ManageEngine EventLog Analyzer 是一个小型应用程序&#xff0c;提供了许多功能。该产品采用无代理方式收集和分析机器生成的日志。该工具可以收集和规范化事件日志和机器数据&#xff0c;并在易于使用的基于 Web 的界面中提供分析、搜索、报告生成和存档等…

华院计算荣获CSDN“创新企业”和“年度创新产品与解决方案”大奖

日前&#xff0c;全国最大的专业开发者社区CSDN发布“2023中国开发者影响力年度榜单”&#xff0c;华院计算凭借其卓越的认知智能引擎平台荣获“创新企业”和“年度创新产品与解决方案”两项大奖。 CSDN 以数据为基础&#xff0c;经过个人或企业提交资料、层层筛选、深入调研、…

【Redis】数据类型、事务执行、内存淘汰策略

目录 数据类型 Redis事务执行步骤 步骤&#xff1a; redis内存淘汰策略 设置内存淘汰策略 1.设置配置文件 2.通过命令设置 数据类型 官网解释 Understand Redis data types | Redis 首先&#xff0c;Redis 的所有键都是字符串,常用的数据类型有 5 种&#xff1a;Strin…

SpringBoot整合WebService

WebService是一个SOA&#xff08;面向服务的编程&#xff09;的架构&#xff0c;它是不依赖于语言&#xff0c;不依赖于平台&#xff0c;可以实现不同的语言间的相互调用&#xff0c;通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西&…

推荐一款电子翻页书制作软件

随着数字化时代的到来&#xff0c;电子书籍越来越受到人们的喜爱。而一款优秀的电子翻页书制作软件&#xff0c;则能够帮助你轻松制作出专业级的电子书&#xff0c;让你的阅读体验更加丰富多彩。 今天&#xff0c;我们就来为大家推荐一款优秀的电子翻页书制作软件——FLBOOK在线…

数据结构 --- 复杂度概念及计算讲解(时间复杂度,空间复杂度)

今天没有sao话&#xff0c;今天认真学习 一、时间复杂度 1、概念讲解 2、计算讲解 二、空间复杂度 1、概念讲解 2、计算讲解 三、常见复杂度对比 四、完结撒❀ 前言&#xff1a; 经常刷题的人都知道&#xff0c;我们在解决一道题时可能有多个解法&#xff0c;那么如何…

使用EasyYapi插件简化导出yapi接口

安装 &#xff1a; 关键配置&#xff1a; 其中的token在这里拿&#xff1a; 使用&#xff1a; 导出当前Controller下的所有api&#xff1a;使用下图命令可仅导出指定的api: 附&#xff1a;配置部分参考了idea&#xff1a;使用easyYapi插件导出yapi接口

Docker Stack(堆栈) 部署多服务集群,多服务编排

1、Docker Stack简介 Docker Stack(堆栈) 是在 Swarm 上管理服务堆栈的工具。而在以前文章docker swarm集群搭建 介绍的 Docker Swarm 只能实现对单个服务的简单部署&#xff0c;于是就引出了Docker Stack。 上面我们介绍到 docker-compose&#xff1a;可以在一台机器上使用…

在阿里云服务器添加ssh,方便远程登录

前言&#xff1a; 添加ssh密钥步骤&#xff1a; chmod 700 .ssh #创建ssh cd .ssh chmod 700 authorized_keys #添加权限密钥 vim authorized_keys #编辑密钥 添加本地电脑ssh密钥 vim /etc/ssh/sshd_config #更改ssh配置文件 配置文件 # no default banner path #Banner no…

【分享】CMMI V3.0版本做了哪些改变?哪些企业适合申请CMMI3.0

​ CMM是由美国卡内基梅隆大学软件工程研究所1987年开发成功的&#xff0c;它基于过去所有软件工程过程改进的成果&#xff0c;吸取了以往软件工程的经验教训&#xff0c;提供了一个基于过程改进的框架&#xff1b;CMMI(Capability Maturity Model Integration能力成熟度模型集…

网络安全-文件包含

一、php://input 我们先来看一个简单的代码 <meta charset"utf8"> <?php error_reporting(0); $file $_GET["file"]; if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://&quo…