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

news2025/5/22 0:34:31

浮点数在内存中的存储

  • 浮点数存储规则
    • 小数点后数值的二进制转换
    • 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);

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

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

相关文章

爬虫与数据分析——爬虫基础知识

目录 一、开发环境二、爬虫的概念三、爬虫与Python&#xff08;一&#xff09;爬虫常用语言&#xff08;二&#xff09;python的特点 四、爬虫环境依赖&#xff08;一&#xff09;python第三方库&#xff08;二&#xff09;第三方库的安装 五、爬虫与HTTP&#xff08;一&#x…

深入理解JVM的内存结构及GC机制(2)

虚拟机栈占用的是操作系统内存&#xff0c;每个线程对应一个虚拟机栈&#xff0c;它是线程私有的&#xff0c;生命周期和线程一样&#xff0c;每个方法被执行时产生一个栈帧&#xff08;Statck Frame&#xff09;&#xff0c;栈帧用于存储局部变量表、动态链接、操作数和方法出…

Docker中Mysql报 mbind: Operation not permitted

问题 我们在docker中安装的mysql运行时报 mbind: Operation not permitted mbind: Operation not permitted mbind: Operation not permitted mbind: Operation not permitted mbind: Operation not permitted mbind: Operation not permitted原因 这是Docker的Seccomp安全限…

python之遍历求二叉树的深度、先序遍历、中序遍历、后序遍历

二叉树的结点用一个数组顺序存储&#xff0c;-1表示该节点为空&#xff0c;实现求该二叉树的深度、先序遍历、中序遍历、后序遍历 首先定义一个 Node 类 &#xff0c;用于表示二叉树中的节点。 class Node:def __init__(self, val):self.val valself.left Noneself.right …

python开发poc

学习使用python做到批量化的漏洞脚本 1.通过fofa搜索结果来采集脚本 2.批量化扫描漏洞 ---glassfish存在任意文件读取在默认48484端口&#xff0c;漏洞验证的poc为: "glassfish" && port"4848" && country"CN" http://loca…

PCF8591(ADDA转换芯片)

工具 1.Proteus 8 仿真器 2.keil 5 编辑器 原理图 讲解 PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行IC总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程&#xff0c;允许在同个I2C总线上接…

序列超图的下一项推荐 笔记

1 Title Next-item Recommendation with Sequential Hypergraphs&#xff08;Jianling Wang、Kaize Ding、Liangjie Hong、Huan Liu、James Caverlee&#xff09;【SIGIR 2020】 2 Conclusion This study explores the dynamic meaning of items in realworld scenarios and p…

回合制游戏战斗模块的制作

回合制游戏战斗模块的制作 回合制游戏相信大家没玩过也见过&#xff0c;了解它的玩法。回合制&#xff0c;那就是你来我回的&#xff0c;你一回合我一回合&#xff0c;直到把对方打败。市面上的回合制游戏比较经典的有梦幻西游&#xff0c;问道&#xff0c;神武&#xff0c;完…

【机器学习入门】集成学习之梯度提升算法

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 第6章 人工神经网络(一) 第6章 人工神经网络(二) 卷积和池化 第6章 使用pytorch进行手写数字识别 实操练习 使用Yolo模型进…

二分法题集2

目录 1 山脉数组的峰顶索引 分析&#xff1a; 代码展示&#xff1a; 2 寻找峰值 分析&#xff1a; 代码展示&#xff1a; 3 寻找旋转排序数组中的最小值 分析&#xff1a; 代码展示&#xff1a; 4 点名 分析&#xff1a; 代码展示&#xff1a; 1 山脉数组的峰顶…

【代码随想录】哈希表

文章目录 242.有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和454. 四数相加 II383. 赎金信15. 三数之和18. 四数之和 242.有效的字母异位词 class Solution {public boolean isAnagram(String s, String t) {if(snull || tnull || s.length()!t.length()){return …

Linux信号机制:进程间高效传递事件与操控指令的桥梁

在Linux操作系统中&#xff0c;信号是一种进程间通信机制&#xff0c;用于通知进程某些事件的发生或请求进程执行特定的动作。信号分为两类&#xff1a;编号1至31的传统UNIX信号&#xff0c;被称为不可靠信号&#xff0c;以及编号32至63的扩展信号&#xff0c;即可靠信号&#…

CMU15/445 2023 Spring-project1 LRU-K 替换策略

在写个demo之前&#xff0c;专门学习了LRU:【LeetCode刷题】146. LRU 缓存-CSDN博客 使用哈希表 双向链表可以满足删除/增加的时间复杂度为O(1)。 在通读完15/445这块的说明之后&#xff0c;发现和LRU还是有些差别的。 官方文档中对LRU-K的解释是&#xff1a;LRU-K算法根据所…

LABVIEW--正弦+高斯噪声信号及滤波

前面板信号 后面板 LABVIEW源程序链接&#xff1a;https://pan.baidu.com/s/11B-75i4fHZwWQyjxn9yCyQ?pwd7tfj 提取码&#xff1a;7tfj

JavaWeb--JavaScript Part 01

1. JavaScript概述 JavaScript&#xff08;简称JS&#xff09;是一种轻量级的、解释执行的客户端脚本语言&#xff0c;主要用于增强网页的交互性和动态性。它起源于Netscape的LiveScript&#xff0c;并在1995年发布时更名为JavaScript。尽管名称中包含"Java"&#xf…

2024.4.3-day08-CSS 盒子模型(溢出显示、伪元素)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.3-学习笔记css溢出显示单行文本溢出显示省略号多行文本溢出显示省…

时序预测 | Python实现BiGRU-RELM时间序列预测

时序预测 | Python实现BiGRU-RELM时间序列预测 目录 时序预测 | Python实现BiGRU-RELM时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BiGRU-RELM时间序列预测分析 将BiGRU和RELM两种模型进行了融合&#xff0c;BiGRU进行预测&#xff0c;RELM对BiGRU模型的预…

LED点阵屏与LCD1602

目录 LED点阵屏 点阵屏的介绍 LED点阵屏分类 点阵屏的显示原理 点阵案例 静态案例 电路图 keil文件 动态案例 电路图 keil文件 LCD1602 LCD1602概述 LCD1602内部结构 存储器结构 LCD引脚及应用电路 时序结构 LCD1602指令集 LCD1602编程 初始化 显示字符 …

使用libibverbs构建RDMA应用

本文是对论文Dissecting a Small InfiniBand Application Using the Verbs API所做的中英文对照翻译 Dissecting a Small InfiniBand Application Using the Verbs API Gregory Kerr∗ College of Computer and Information ScienceNortheastern UniversityBoston, MAkerrgccs…

三防笔记本丨工业笔记本电脑丨助力测绘行业的数字化转型

测绘行业测绘行业一直是高度技术化的领域&#xff0c;其重要性在于为建设、规划和资源管理提供准确的地理数据。然而&#xff0c;随着技术的发展&#xff0c;传统的测绘方法已经难以满足对数据精度和实时性的要求。因此&#xff0c;测绘行业正逐渐向数字化转型&#xff0c;采用…