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

news2024/11/23 3:09:53

文章目录

  • 前言
  • 一、浮点数在内存中的存储
    • 练习引入
    • 浮点数的存储
    • 浮点数存的过程
  • 二、浮点数取的过程
    • 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.coloradmin.cn/o/2135788.html

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

相关文章

智汇创想pytest接口自动化测试框架

本测试框架是基于pytest搭建的接口自动化框架&#xff0c;对象为深圳智汇创想官方网站。深圳智汇创想科技有限责任公司&#xff08;深圳智汇创想科技有限责任公司&#xff09;&#xff0c;是一家专注于跨境电子商务的集团公司&#xff0c;全球电商平台多品类多品牌的零售商&…

什么是APT攻击,有哪些防御策略

在数字化时代&#xff0c;网络安全已成为国家、企业和个人不可忽视的重要议题。其中&#xff0c;高级持续性威胁&#xff08;APT&#xff09;攻击以其隐蔽性强、攻击规模大、持续时间长等特点&#xff0c;成为网络安全领域最为棘手的问题之一。面对APT攻击的严峻挑战&#xff0…

Unity 场景优化(1) game视口的Statistics 内容介绍

Unity的 Statistics &#xff08;stats&#xff09; Unity是多线程的。但是控制使用unity的api必须在主线程中&#xff0c;比如控制物体的transform信息。 Audio Level&#xff1a; DSP Load&#xff1a;数字信号处理&#xff08;Digital Signal Processing&#xff09;负载&…

空间视频化趋势理解

「视频空间化」这个趋势不是从现在开始&#xff0c;而是潜在发展了很多年了&#xff0c;而且我个人觉得「视频空间化」的背后其实对应的是「空间视频化」的趋势&#xff0c;所以未来我们还是要注重自己的技术栈中对视频相关处理技术的吸收以及整合&#xff0c;下面是我的几个理…

Jenkins生成html报告

下载插件 1.需要下载插件 html Publisher plugins 2.下载Groovy(设置css样式&#xff09;&#xff0c;默认没有css样式 在Job配置页面&#xff0c;增加构建步骤Execute system Groovy script&#xff0c;在Groovy Command中输入上面命令&#xff0c;即可&#xff1a; System.…

清理C盘缓存的垃圾,专业清理C盘缓存垃圾与优化运行内存的策略

专业清理C盘缓存垃圾与优化运行内存的策略 一、清理C盘缓存垃圾 在Windows操作系统中&#xff0c;C盘通常作为系统盘&#xff0c;其健康状况直接影响到系统的整体性能。定期清理C盘中的缓存和垃圾文件是维护系统性能的重要步骤。以下是一些专业建议&#xff1a; 1.使用磁盘清…

二叉树链式结构与简单实现

二叉树链式结构与简单实现 一、二叉树的链式结构二、二叉树的简单实现二叉树的遍历前序、中序以及后序遍历层序遍历 结点个数以及高度等二叉树的创建和销毁判断二叉树是否为完全二叉树 三、源码展示在 BinaryTree.h 中&#xff1a;在 BinaryTree.c 中&#xff1a; 以下代码环境…

建筑机器人通用操作系统设计方案

建筑机器人操作系统通用发行版概述 1. 基础版&#xff08;Entry Level&#xff09; 目标用户&#xff1a;小型建筑公司、DIY爱好者或初学者。特点&#xff1a;提供基础的机器人控制和任务管理功能&#xff0c;支持简单的自动化作业流程&#xff0c;如基础的混凝土搅拌、物料搬…

微信批量自动添加好友

现代社交领域中&#xff0c;微信已然成为人们生活中不可或缺的一部分。它不仅是朋友之间保持联系、分享生活点滴的重要沟通工具&#xff0c;更是商务人士拓展人脉、开展业务的得力助手。 在日常生活中&#xff0c;我们每天都会结识许多新朋友&#xff0c;这无疑为我们的社交圈…

两段有趣的代码(C语言函数指针)

目录 part1part2 两段有趣的代码 part1 (*(void (*)())0)();我们知道函数指针&#xff1a; void (*p)()去掉函数指针变量名就是函数指针的类型&#xff1a; void (*)()那这段代码我们就可以理解为将0强制转换为函数指针类型&#xff0c;再进行解引用;进行调用函数&#xff…

python容器四之字典

文章目录 1. 字典介绍2. 使用字典3. 字典的常见操作3.1 添加元素3.2 删除元素3.3 修改元素3.4 查找元素 4. 字典遍历方法4.1 遍历字典元素 5. 公共运算符6. 公共方法 1. 字典介绍 先来看看现实生活中的字典。我们知道&#xff0c;可以应用字典来查找汉字。 在这里插入图片描述…

Hash 专题

一、散列表 根据 key 计算 key 在表中的位置的数据结构&#xff1b;是 key 和其所在 存储地址的映射关系&#xff1b; 注意&#xff1a;散列表的节点中 kv 是存储在一起的&#xff1b; 结构&#xff1a; 二、选择hash的原因 1、需要很强的查找效率 2、强随机分布&#xff…

计算机网络:概述 - 计算机网络概述

目录 一. 互联网概述 1.1 网络 1.2 互联网 1.3 因特网 二. 互联网发展的三个阶段 三. 互联网的标准化工作 四. 互联网的组成 五. 计算机网络的类别 5.1 计算机网络的定义 5.2 计算机网络的不同类别 一. 互联网概述 起源于美国的互联网现如今已…

前端必知必会-响应式网页设计之媒体查询

文章目录 响应式网页设计 - 媒体查询什么是媒体查询&#xff1f;添加断点始终以移动设备为先进行设计另一个断点典型的设备断点方向&#xff1a;纵向/横向使用媒体查询隐藏元素使用媒体查询更改字体大小 总结 响应式网页设计 - 媒体查询 什么是媒体查询&#xff1f; 媒体查询…

动态规划前---选----

前言&#xff1a;基本的算法思路还是先看数据范围&#xff0c;接着看能不能用动态规划来做&#xff0c;刚刚好这个题目可以套用前—选— 题目地址 #include<bits/stdc.h> using namespace std;#define int long long int n,m; const int N (int)305; int dp[N][N]; // 前…

中国电子学会202406青少年软件编程(Python)等级考试试卷(四级)真题与解析

一、单选题(共25题, 共50分) 1.执行以下程序后所输出的结果是?( ) A 20 B 41 C 21 D 91 2.以下说法错误的是?( ) A python中可以在不同的自定义函数中声明相同名字的变量,使用时不会造成数据混乱 B 形参在其自定义函数内不能与其它变量重名 C …

初一信息科技2024指南辅助教学软件(抓包软件)

专门针对信息科技20204指南写的程序&#xff0c;互联网和直播等知识中包含tcp/ip和udp&#xff0c;三次握手等原理&#xff0c;需要简单明了的实验来说明&#xff0c;在机房中需要用抓包软件&#xff0c;可能需要安装windump npcap等软件非常繁琐&#xff0c;还需要接触保护卡&…

Leetcode 寻找重复数

可以使用 位运算 来解决这道题目。使用位运算的一个核心思想是基于数字的二进制表示&#xff0c;统计每一位上 1 的出现次数&#xff0c;并与期望的出现次数做比较。通过这种方法&#xff0c;可以推断出哪个数字重复。 class Solution { public:int findDuplicate(vector<i…

如何写出高效的软件测试用例?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 编写测试用例的目的就是确保测试过程全面高效、有据可查。但要编写出高效的测试用例&#xff0c;需要搞清楚什么是测试用例&#xff0c;以及如何编写出高效的测试用…

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

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