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

浮点数在内存中的存储

  • 浮点数存储规则
    • 小数点后数值的二进制转换
    • 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.hqwc.cn/news/597844.html

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

相关文章

数据结构——二叉树链式结构的实现

大家好我是小锋&#xff0c;今天我们来学习的是二叉树链式结构的实现 首先我们来学习一下二叉树的基本操作 在看二叉树基本操作前我们来回顾下二叉树的概念&#xff0c; 二叉树是&#xff1a; 1. 空树 2. 非空&#xff1a;根节点&#xff0c;根节点的左子树、根节点的右…

Android Studio学习4——gradle文件

视频讲解 https://developer.android.google.cn/studio/releases/gradle-plugin.htmIl#updating-gradle

最具有影响力的三个视觉平台 | 3D高斯、场景重建、三维点云、工业3D视觉、SLAM、三维重建、自动驾驶

大家好&#xff0c;我是小柠檬 这里给大家推荐三个国内具有影响力的3D视觉方向平台&#xff01; 原文&#xff1a;最具有影响力的三个视觉平台 | 3D高斯、场景重建、三维点云、工业3D视觉、SLAM、三维重建、自动驾驶

桌面便签电脑版哪个好?好用便签是哪款

在快节奏的现代生活中&#xff0c;桌面便签软件成为了我们不可或缺的助手。它们轻便、灵活&#xff0c;能够随时记录重要事项&#xff0c;提醒我们按时完成各项任务。面对市面上众多的便签软件&#xff0c;选择一款既实用又好用的便签显得尤为重要。经过深入体验&#xff0c;我…

Redis数据库——主从、哨兵、群集

目录 前言 一、主从复制 1.基本原理 2.作用 3.流程 4.搭建主动复制 4.1环境准备 4.2修改主服务器配置 4.3从服务器配置&#xff08;Slave1和Slave2&#xff09; 4.4查看主从复制信息 4.5验证主从复制 二、哨兵模式——Sentinel 1.定义 2.原理 3.作用 4.组成 5.…

最好的桌面监控系统

最好的桌面监控系统 桌面监控为什么重要&#xff0c;因为内鬼泄密对企业的危害要远远大于黑客和病毒的攻击&#xff0c;因为内鬼可以直接接触到重要文件&#xff0c;也知道重要文件放置在哪里&#xff0c;所以需要对员工的桌面进行监控。 域智盾是市面上最好的监控软件。 域智…

基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析教程

原文链接&#xff1a;基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600473&idx6&sn431e9408a42862d29fe4f4ef7703595b&chksmfa8208becdf581a820d9479d2aa61b88e96612c4ab72b0…

【MySQL】数据操作语句(DML)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习计网、mysql和算法 ✈️专栏&#xff1a;MySQL学习 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

Selenium自动化Page模式(Python)

Selenium是当前主流的web自动化工具&#xff0c;提供了多种浏览器的支持&#xff08;Chrome,Firefox, IE等等&#xff09;&#xff0c;当然大家也可以用自己喜欢的语言&#xff08;Java&#xff0c;C#&#xff0c;Python等&#xff09;来写用例&#xff0c;很容易上手。当大家写…

Day:004(2) | Python爬虫:高效数据抓取的编程技术(数据解析)

正则表达式实战-腾讯新闻 需求&#xff1a; 使用正则获取腾讯新闻标题内容 网站&#xff1a;https://sports.qq.com/ 代码&#xff1a; import reimport requests from fake_useragent import UserAgenturl https://sports.qq.com/ # 构建请求头信息 headers {User-Agent:…

C语言函数实现冒泡排序

前言 今天我们来看看怎么使用函数的方式实现冒泡排序吧&#xff0c;我们以一个数组为例arr[] {9,8,7,6,5,4,3,2,1,0},我们将这个数组通过冒泡排序的方式让他变为升序吧。 代码实现 #include<stdio.h> void bubble_sort(int arr[], int sz) {int i 0;for (i 0;i < s…

静态住宅IP代理的作用:提升跨境电商海外收款系统的稳定性

跨境电商正是当下电子商务的热门领域&#xff0c;充斥着发展机遇。然而&#xff0c;跨境电商面临着收款系统不稳定的问题&#xff0c;这直接影响到了商家的资金流动和运营效率。而高匿住宅静态IP的运用可以有效提升跨境电商海外收款系统的稳定性&#xff0c;让我们一起来看看其…