浮点数在内存中的存储【详解】

浮点数在内存中的存储

  • 浮点数存储规则
    • 小数点后数值的二进制转换
    • float和double存储图示
    • 优化存储方案
      • E不全为0或不全为1
      • E全为0
      • E全为1

浮点数存储规则

大家都知道整型数据是以补码的方式存放在内存中。以下几个概念是需要知道的:

  • 原码,补码,反码都是以二进制形式表示的。
  • 正整数的原码,反码,补码都相同。
  • 负整数的补码=反码+1=原码的符号位不变,数值位按位取反。
    但是浮点数不同,浮点数有着一套自己的存储规则。

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:

  • (-1)^S * M * 2^E
  • (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
  • M表示有效数字,大于等于1,小于2。
  • 2^E表示指数位。
  • E是一个无符号整数。

小数点后数值的二进制转换

大家对于整数的二进制转换是了熟于心,但是往往会忽略了小数的二进制转换。

            7.25

例如上面的十进制数字7.25,小数点前的7可以转换为:
         4 + 2 + 1 = 2 2 + 2 1 + 2 0 = 111 4+2+1=2^{2}+2^{1}+2^{0}=111 4+2+1=22+21+20=111
小数点后的数值0.25转换为:
         1 4 = 1 2 2 = 2 − 2 = . 01 \frac{1}{4}=\frac{1}{2^{2}}=2^{-2}=.01 41=221=22=.01
所以:

          7.25=111.01

所以按照规则,用float来存储7.25的话:

7.25=111.01 = ( − 1 ) 0 ∗ 1.1101 ∗ ( 2 ) 2 (-1)^{0}*1.1101*(2)^{2} (1)01.1101(2)2

  • S=0
  • M = 1.1101
  • E = 2

float和double存储图示

  IEEE 754规定: 对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。
在这里插入图片描述

对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
在这里插入图片描述

优化存储方案

前面提到的规则是0<=M<=1。这就导致当浮点数不为0时,M一定是1.***这样的格式的,小数点前面一定会有一个1。每次都存储这个1显得冗余浪费空间。因此IEE 754规定存储在内存中时,去除掉小数点前的1,只将小数点后面的二进制数值存进去。

下面我们来看一种情况:

         0.5的存储

( 0.5 ) 10 (0.5)_{10} (0.5)10= ( 0.1 ) 2 (0.1)_{2} (0.1)2 = ( − 1 ) 0 ∗ 1.0 ∗ ( 2 ) − 1 (-1)^{0}*1.0*(2)^{-1} (1)01.0(2)1
  我们会发现一个特别的现象,E=-1,前面说过,E是一个无符号整数,那这个-1该怎么存储呢?
  IEE 754规定:
  存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。
所以这里是float类型,E=-1,存储时加上127,也就是真正存入内存的是:-1+127=126。
另外E从内存中取出还有三种情况值得我们注意:

E不全为0或不全为1

这就是上面我们讨论的那种情况,

  • 如果是float类型的,取出来的数直接减去127,就可得到E的真实值。
  • 如果是double类型的,取出来的数直接减去1023,就可得到E的真实值。

E全为0

这个作为特殊对待,如果E全为0,说明真实值为-127,也就是这个数是一个 1 2 127 \frac{1}{2^{127}} 21271的,这已经是一个很小很小的数了,无限接近于0了。
因此,IEEE 754规定,

  • 如果是float类型的,E全为0时,E=1-127(可不是前面说的-127,那只是举例)。
  • 如果是double类型的,E全为0时,E=1-1023
  • 既然此时数值无限接近0,那么M也就不需要再加上1,但是S依旧需要,用来标识±0。

E全为1

这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++入门语法(命名空间缺省函数函数重载引用内联函数nullptr)

目录 前言 1. 什么是C 2. C关键字 3. 命名空间 3.1 命名空间的定义 3.2 命名空间的使用 4. C输入和输出 5. 缺省函数 5.1 概念 5.2 缺省参数分类 6. 函数重载 6.1 概念 6.2 为何C支持函数重载 7. 引用 7.1 概念 7.2 特性 7.3 常引用 7.4 引用与指针的区别 7…

docker-compose安装dozzle

dozzle是一个docker日志的webui工具 安装配置 docker-compose.yaml version: "3" services:dozzle:container_name: dozzleimage: amir20/dozzle:v4.11.4volumes:- /var/run/docker.sock:/var/run/docker.sockrestart: unless-stoppedports:- 20342:8080networks:cu…

人工智能 - 服务于谁?

人工智能服务于谁&#xff1f; 人工智能服务于生存&#xff0c;其最终就是服务于战争&#xff08;热战、技术战、经济战&#xff09; 反正就是为了活着而战的决策。 既然人工智能所有结果&#xff0c;来自大数据的分挖掘&#xff08;分析&#xff09;也就是数据的应用&#x…

施耐德中高端PLC仿真器

参考文档&#xff1a;《Unity Pro PLC 仿真器》EIO0000001719.06 &#xff08;Control Expert 就是 Unity Pro 最新版本换了个名字&#xff0c;两者操作基本相同&#xff09; https://www.schneider-electric.cn/zh/download/document/EIO0000001719/ 1. 适用 PLC 这里使用的…

idea常用配置

IDEA设置全局配置 参考&#xff1a;IDEA设置全局配置_idea如何打开一个项目,全局设置-CSDN博客 idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文件夹等不必要的文件 参考&#xff1a;idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文…

【Frida】【Android】 工具篇:查壳工具大赏

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

MIT6.828 Lab1 Xv6 and Unix utilities

2023MIT6.828 lab-1 官方地址 一、sleep 实验内容 调用sleep&#xff08;系统调用&#xff09;编写用户级别程序能暂停特定时常的系统滴答程序保存在user/sleep.c 实验过程 xv6的参数传递 查看官方文档提示的文件中&#xff0c;多采用如下定义&#xff1a; int main(in…

window安装maven和hadoop3.1.4

前面的文章已讲解如何安装idea和进行基本设置&#xff0c;本文主要带着大家安装配置好maven和hadoop. 大家不用去官网下载&#xff0c;直接使用我发给大家的压缩文件&#xff0c;注意解压后的文件夹不要放在中文目录下&#xff0c;课堂上我们讲解过原因。 这是我电脑上的路径&a…

#QT项目实战(天气预报)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a; 3.记录&#xff1a; &#xff08;1&#xff09;调用API的Url a.调用API获取IP whois.pconline.com.cn/ipJson.jsp?iphttp://whois.pconline.com.cn/ipJson.jsp?ip if(window.IPCallBack) {IPCallBack({"ip":&quo…

Java 外观模式

外观模式隐藏了系统的复杂性。 它为客户端提供了一个简单的接口&#xff0c;客户端使用接口与系统交互。 外观模式是结构型模式。 例子 class ShapeFacade {interface Shape {void draw();}class Rectangle implements Shape {Overridepublic void draw() {System.out.prin…

Win主机拷贝文件到Ubuntu虚拟机

之前在虚拟机Ubuntu16.04版本拷贝文件没有遇到问题&#xff0c;今天新装了Ubuntu20.04无法直接拖拽或者拷贝粘贴。 1安装open-vm-tools sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools-desktop sudo reboot2禁用Wayland sudo gedit /etc/gdm3/…

大创项目推荐 深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…

正确使用@Resource

目录 1 怎么使用Resource&#xff1f;1.0 实验环境1.1 通过字段注入依赖1.2 bean property setter methods &#xff08;setter方法&#xff09; 2 打破岁月静好&#xff08;Resource takes a name attribute&#xff09;2.1 结论2.2 那我不指定呢&#xff1f;【结论&#xff1…

自己买域名还是通过域名中介购买域名比较好?

选择直接购买域名还是通过域名中介购买&#xff0c;主要取决于你的具体需求、预算和所面临的风险。下面是一些考虑因素&#xff0c;帮助你做出决定&#xff1a; 直接购买域名的优势&#xff1a; 1.成本较低&#xff1a;如果域名未被注册&#xff0c;直接在域名注册商处注册…

十分钟让我带你入门Pandas基础使用

如何导入 通常&#xff0c;我们按如下方式导入&#xff1a; In [1]: import numpy as npIn [2]: import pandas as pdPandas的基本数据结构 Pandas 提供了两种类型的类来处理数据&#xff1a; Series: 保存任何类型数据的一维标记数组 such as integers, strings, Python obj…

R语言lavaan结构方程模型在生态学研究中的应用介绍及要点回顾

除了一般的线性回归外&#xff0c;SEM可以用于探究&#xff1a;测量不变性&#xff08;Measurement invariance&#xff09;、多组模型&#xff08;Multiple group modelling)、潜在增长模型&#xff08;Latent growth modeling&#xff09;、非线性混合模型&#xff08;Nonlin…

MySQL如何创建存储过程

工作中有时候需要自己去创建存储过程&#xff0c;然后调用存储去获得一些数据等&#xff0c;接下来就给大家介绍下MySQL如何创建存储过程。 语法&#xff1a; CREATE PROCEDURE 存储程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过…

【保姆级教程】如何在 Windows 上实现和 Linux 子系统的端口映射

写在前面 上次分享【保姆级教程】Windows上安装Linux子系统&#xff0c;搞台虚拟机玩玩&#xff0c;向大家介绍了什么是虚拟机以及如何在Windows上安装Linux虚拟机。对于开发同学而言&#xff0c;经常遇到的一个问题是&#xff1a;很多情况下代码开发需要依赖 Linux 系统&…

Mac 配置 Aria2

文章目录 1. Aria2 安装1.1 安装 brew1.2 安装 Aria2 2. 配置 Aria22.1 创建配置文件 aria2.conf 和空对话文件 aria2.session2.2 编辑配置文件 aria2.conf 3. 开机启动设置3.1 创建用户启动文件3.2 管理自启动项 4. 配置 BT tracker 自动更新4.1 XIU2/TrackersListCollection …

zheng项目:从零到一打造全方位J2EE企业级开发解决方案

zheng项目&#xff1a;从零到一打造全方位J2EE企业级开发解决方案 摘要&#xff1a; 在当今快速发展的企业级应用开发领域&#xff0c;一套高效、稳定且可扩展的解决方案对于企业的成功至关重要。zheng项目旨在提供一套全面的J2EE企业级开发解决方案&#xff0c;从前端模板到自…