C语言浮点型数据在内存中的存储(23)

文章目录

  • 前言
  • 一、浮点数在内存中的存储
    • 练习引入
    • 浮点数的存储
    • 浮点数存的过程
  • 二、浮点数取的过程
    • E不全为0或不全为1
    • E全为0
    • E全为1
  • 三、再回顾练习
  • 总结


前言

  哎,之前写了一篇,可是中途退出没保存,只能再写一遍了~
  浮点数在内存中的存储跟整型还是有很大区别的
  正文开始!


一、浮点数在内存中的存储

  常见的浮点数有:3.14159、1E10,浮点数家族包括float、double、long double等类型
  浮点数表示的范围:float.h 中定义

练习引入

#include <stdio.h>  int main()
{int n = 9;float* pFloat = (float*)&n;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;
}

猜猜看输出结果是什么?答案可能令你大感意外

在这里插入图片描述

从这里,你应该就要考虑到整型和浮点数在内存中的存储是大相径庭了

浮点数的存储

  根据国际标准IEEE 754,任意一个二进制浮点数都可以表示成下面的形式

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

  1. (-1)S 表示符号位,当 S = 0 时,V 为正数;当 S = 1 时,V为负数
  2. M表示有效数字,M是大于等一1,小于2的
  3. 2E 表示指数位

举个例子:
十进制的5.0,写成二进制是101.0,相当于1.01 * 22 ,那么按照 V 的形式,可以得出S = 0,M = 1.01,E = 2

IEEE 754规定:
对于32位的浮点数,最高的1位存储符号位是S,接着的是8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最高的1位存储符号位是 S,接着的是11位存储指数E,剩下的52位存储有效数字M

还有你想一下3.14,二进制是11.几,这个“几”到底是多少?,运用乘2看个位的方法可以发现,很难取尽,超过了float的M能存的二进制位,所以,有相当一部分浮点数,其实是有精度丢失

暂时先不管这个,不如我们先再来看看存储:
在这里插入图片描述

浮点数存的过程

IEEE 754对有效数字M和指数E,还有一些特别规定

前面说过,1 <= M < 2,M可以写成1.xxxxxx形式,其中xxxxxx表示小数部分

IEEE 754规定,在计算机内部保存M的时候,因为百分百可以确保这个数的第一位总是1,所以可以被舍去,只保存后面的xxxxx部分,比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去后,等于可以保存24位有效数字。

至于指数E,情况就比较复杂
首先,E是一个无符号整数

这意味着,如果E为8位,它的取值范围为 0 ~ 255,如果E为11位,它的取值范围为 0 ~ 2047 但是,我们知道,科学计数法的E是可以出现负数的,所以IEEE 754规定,存入内存时的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,210 的E是10,所以保存成32位浮点数时,必须保存成10 + 127 = 137,即10001001

二、浮点数取的过程

  这个过程比较重要,于是我们单开来讲
  指数E从内存中取出还可以再分成三种情况

E不全为0或不全为1

 这时,浮点数就采用下面的规则表示,即指数的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。

 比如:0.5 的二进制表示为 0.1,由于规定正数部分必须为 1,即将小数点右移 1 位,则为 1.0*2^(-1),其余部分为 -1 + 127(中间值)= 126,表示为 01111110,而尾数 1.0 去掉整数部分为 0,补齐 0 到 23 位 00000000000000000000000
 则其二进制表示形式为:
0 01111110 00000000000000000000000

E全为0

 说明真实E为 -127 ,你可以想象(-1)S * 1.几 * 2-127 ,相当于是无穷接近于0,这时候就不需要按照正常形式取出了,而是M不再加上第一位的1,而是还原为0.xxxxx的小数,这样做是为了表示±0,以及接近于0的很小的数字
 0 00000000 00100000000000000000000

E全为1

 说明真实E为128,这时候,如果有效数字M全为0,表示±无穷大
 0 11111111 0001000000000000000000

当然,E为全0或者全1仅作了解即可

三、再回顾练习

  我们再看前文的代码
  9是正数,补码很好求解,我们如果以%f打印,相当于把9的补码当陈了浮点数,E全为0,那么结果就为0

  而下半部分,把9.0f按照浮点数的形式存储,9就是1001.0,科学计数法就是1.001 * 23 ,这时候在内存中的存储就是0 10000010 00100000000000000000000,以%d打印出来就是1 091 567 616

另外,我们思考,两个浮点数比较大小的时候,直接使用 == 比较可能存在问题
所以,这时候确保自己的精度位,保证精度即可


总结

  但是我还是再写了一遍!
  还是挺满意这篇的,比较精炼

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

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

相关文章

计算左边(比自己小的元素)的最长距离

前言&#xff1a;一般做的题目都是使用单调栈来求出距离这个点最近的那个比这个数大或小的元素&#xff0c;但是如果是需要找到最远的那个元素呢&#xff1f;我们可以用到类似逆序对的思路&#xff0c;我们先进行排序从小到大&#xff0c;接着我们先处理左边&#xff0c;每次维…

vue3使用vscode开发遇到热更新问题(文件保存页面不实时更新)

1.第一种情况是所有页面都不热更新 检查Live Server插件&#xff0c;确保安装&#xff0c;安装也无效可以试一下重新安装 2.只有个别页面没有热更新(本人是这种情况) 遇到这种情况就要检查路由文件中导入的文件名称与项目中文件名字是否一致(大小写也要一样) 若路由文件中 导…

利用shuji还原webpack打包源码

0 前言 前段时间做一个银行的项目&#xff0c;是在别人已经打过好多次的基础上继续打&#xff0c;而且时间很短&#xff0c;也是没办法要有产出&#xff0c;这个银行很多站点都是webpack打包&#xff0c;就新学了一个点&#xff1a;利用shuji获取webpack打包站源码&#xff08…

设置使用阿里云服务器DNS

由于云服务器是从腾讯云迁移到阿里云&#xff0c;然后使用ssl验证时一直无法使用dns验证&#xff0c;也无法创建三级域名&#xff0c;原来需要把阿里云服务器改成阿里云的dns使用 如果使用其他服务器DNS会下面会显示当前DNS服务器&#xff0c;

怎么将flv转换成mp4格式?这几种转换方法超多人在用!

怎么将flv转换成mp4格式&#xff1f;FLV&#xff0c;这一视频格式在大众视野中相对边缘化&#xff0c;其鲜为人知并非偶然&#xff0c;背后隐藏着多重挑战&#xff0c;首要挑战在于其兼容性的局限&#xff0c;由于FLV的小众属性&#xff0c;许多现代软件与操作系统并未给予充分…

day-55 不同路径

思路 动态规划&#xff1a;因为只能向右或向下移动&#xff0c;可以得出状态转换方程&#xff1a;dp[i][j]dp[i-1][j]dp[i][j-1] 解题过程 直接令第一行和第一列全为1&#xff0c;然后通过状态转换方程进行计算&#xff0c;返回dp[m-1][n-1]即可 Code class Solution {publi…

53.【C语言】 字符函数和字符串函数(strcmp函数)

7.strcmp函数 *简单使用 cplusplus的介绍 点我跳转 strcmp:string compare 字符串比较 具体讲解见此文 点我跳转 *例题 求下列代码的执行结果 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() {char arr1[20] { &quo…

Java项目: 基于SpringBoot+mybatis+maven新闻推荐系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven新闻推荐系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

时间安全精细化管理平台存在未授权访问漏洞

漏洞描述 登录--时间&amp;安全精细化管理平台存在未授权访问漏洞导致与员工信息泄露 FOFA&#xff1a; body"登录--时间&amp;安全精细化管理平台" POC IP/acc/_checkinoutlog_/

Amoco:一款针对二进制源码的安全分析工具

关于Amoco Amoco是一款功能强大的二进制源码静态分析工具&#xff0c;该工具基于Python 3.8开发&#xff0c;可以帮助广大研究人员轻松对二进制程序执行静态符号分析。 工具特性 1、一个通用的指令解码框架&#xff0c;旨在减少实现对新架构的支持所需的时间。例如&#xff0c…

Go第三方框架--gin框架(三)

5. net/http框架源码-- 多路复用的实现 这块核心功能对应 1.3 的圆圈2&#xff0c;所属代码如下图&#xff1a; run代码涉及的操作不是gin框架的核心&#xff0c;还记的我说过gin是在net/http的基础上操作的吗&#xff0c;我们来看下gin和net/http包的关联关系。 gin: 主要建…

批发供应系统案例分析

在快速变化的商业环境中&#xff0c;创新成为推动批发供应行业不断前行的关键动力。以下将通过几个案例分析&#xff0c;探讨创新批发供应系统如何引领行业变革&#xff0c;提升效率&#xff0c;优化服务&#xff0c;并创造新的市场机遇。 一、智能化库存预测与补货系统 案例概…

人工智能在鼻咽癌中的应用综述|文献精析·24-09-13

小罗碎碎念 这篇文章系统回顾了人工智能在鼻咽癌管理中的应用&#xff0c;发现AI在提高诊断、预后评估和放疗计划的自动化方面具有积极影响。 作者角色作者姓名单位&#xff08;中文&#xff09;第一作者Wai Tong Ng香港大学深圳医院临床肿瘤中心&#xff0c;中国&#xff1b;香…

不可思议!这7个反共识设计原则,正悄然改变AI应用的未来格局!

引言 在AI技术日益成熟的今天&#xff0c;如何设计出既符合用户需求又具备高度智能化的原生应用&#xff0c;成为摆在开发者面前的重要课题。然而&#xff0c;传统的应用设计思维往往限制了AI潜力的充分发挥。本文提出的七个反共识观点&#xff0c;旨在挑战传统观念&#xff0…

老程序员的数字游戏开发笔记(一) —— 世界从Godot开始

目录 开篇废话 GDScript 是什么 创建 GDScript 背后的动机是什么 Godot 会支持【此处插入 FMOD、GameWorks 等闭源 SDK 的名字】吗&#xff1f; 是否能用 Godot 创建非游戏应用&#xff1f; Godot 使用的用户界面工具包是什么&#xff1f; 为什么 Godot 使用 SCons 构建…

抖音视频下载

对于特别喜欢的视频有时需要珍藏&#xff0c;下文方法可能会帮到你&#xff0c;但要注意尊重版权和遵守相关声明。 Edge浏览器打开抖音短视频&#xff0c;按F12&#xff0c;选择 网络&#xff1b;筛选条件?a&#xff1b;双击搜索结果打开视频&#xff1b;选择想要的视频&…

镜像问题(k8s部署考试系统)

如果使用containerd拉取不到镜像的话&#xff0c;就使用docker 1.修改decker的镜像源 [rootk8s-master ~]# vim /etc/docker/daemon.json { "registry-mirrors": [ "https://do.nark.eu.org", "https://dc.j8.work", …

SSM 传统工艺品销售网站---附源码74714

摘 要 近年来&#xff0c;信息网络迅猛推进&#xff0c;其具有灵活方便、传递消息速度快等优点&#xff0c;这一新兴媒体日渐兴盛&#xff0c;已经成为人们日常生活获取信息一个重要手段。从08开始&#xff0c;电商行业如春风吹过后的小草&#xff0c;呈现出一片蓬勃地发展态势…

人力资源管理系统员工组织与微软AD域服务系统集成案例

一、项目背景 上海某电路半导体有限公司主要产品应用于图像传感器、 图像信号处理芯片、 低功耗芯片、 射频芯片等。 公司内部HR人力资源管理系统统一进行人员批量预入职和同步等流程&#xff0c;由SAP PO平台进行中间管理&#xff0c;在微软AD域系统上创建人员&#xff0c…

若依plus-cloud nacos yml 动态获取 配置内容

这是剑走偏锋的写法。 直接上代码 在nacos中配置一个ruoyi-cms.yml 内容中有cms:filepath:******* springcloud配置 package org.dromara.cms.entity;import lombok.RequiredArgsConstructor; import org.springframework.core.env.Environment; import org.springframewo…