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.mfbz.cn/a/881332.html

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

相关文章

python线程(python threading模块、python多线程)(守护线程与非守护线程)

文章目录 Python多线程入门1. Python多线程概述2. threading模块基础- Thread 类: 这是一个代表线程的类。可以通过创建Thread类的实例来新建一个线程。- Lock 类: 在多线程环境中&#xff0c;为了防止数据错乱&#xff0c;通常需要用到锁机制。Lock类提供了基本的锁功能&#…

ArcGIS10.2/10.6安装包下载与安装(附详细安装步骤)

相信从事地理专业的小伙伴来说&#xff0c;应该对今天的标题不会陌生。Arcgis是一款很常用的地理信息系统软件&#xff0c;主要用于地理数据的采集、管理、分析和展示。目前比较常见的版本有ArcGIS 10.2和ArcGIS 10.6。 不可否认&#xff0c;Arcgis具有强大的地图制作、空间分…

第4步CentOS配置SSH服务用SSH终端XShell等连接方便文件上传或其它操作

宿主机的VM安装CENTOS文件无法快速上传&#xff0c;也不方便输入命令行&#xff0c;用SSH终端xshell连接虚拟机的SSH工具就方便多了&#xff0c;实现VM所在宿主机Win10上的xshell能连接vm的centos要实现以下几个环节 1、确保宿主机与虚拟机的连通性。 2、虚拟机安装SSH服务&…

针对Docker容器的可视化管理工具—DockerUI

目录 ⛳️推荐 前言 1. 安装部署DockerUI 2. 安装cpolar内网穿透 3. 配置DockerUI公网访问地址 4. 公网远程访问DockerUI 5. 固定DockerUI公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

AJAX(一)HTTP协议(请求响应报文),AJAX发送请求,请求问题处理

文章目录 一、AJAX二、HTTP协议1. 请求报文2. 响应报文 三、AJAX案例准备1. 安装node2. Express搭建服务器3. 安装nodemon实现自动重启 四、AJAX发送请求1. GET请求2. POST请求(1) 配置请求体(2) 配置请求头 3. 响应JSON数据的两种方式(1) 手动&#xff0c;JSON.parse()(2) 设置…

毕业设计选题:基于ssm+vue+uniapp的校园商铺系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

分发饼干00

题目链接 分发饼干 题目描述 注意点 1 < g[i], s[j] < 2^31 - 1目标是满足尽可能多的孩子&#xff0c;并输出这个最大数值 解答思路 可以先将饼干和孩子的胃口都按升序进行排序&#xff0c;随后根据双指针 贪心&#xff0c;将当前满足孩子胃口的最小饼干分配给该孩…

旋转矩阵乘法,自动驾驶中的点及坐标系变换推导

目录 1. 矩阵乘法的内项相消 2. 左右乘&#xff0c;内外旋与动静坐标系 3. 点变换 3.1 点旋转后的点坐标表示 3.2 坐标系旋转后的点坐标表示 4. 坐标变换的实质 1. 矩阵乘法的内项相消 关于旋转变换&#xff0c;离不开矩阵的乘法&#xff0c;而矩阵乘法的物理意义和本身数…

[Linux#55][网络协议] 序列化与反序列化 | TcpCalculate为例

目录 1. 理解协议 1.1 结构化数据的传输 序列化与反序列化 代码感知&#xff1a; Request 类 1. 构造函数 2. 序列化函数&#xff1a;Serialize() 3. 反序列化函数&#xff1a;DeSerialize() 补充 4. 成员变量 Response 类 1. 构造函数 2. 序列化函数&#xff1a;…

【软件基础知识】什么是 API,详细解读

想象一下,你正在使用智能手机上的天气应用。你打开应用,瞬间就能看到实时天气、未来预报,甚至是空气质量指数。但你有没有想过,这些数据是如何神奇地出现在你的屏幕上的?答案就在三个字母中:API。 API,全称Application Programming Interface(应用程序编程接口),是现代软件世…

MYSQL面试知识点手册

第一部分&#xff1a;MySQL 基础知识 1.1 MySQL 简介 MySQL 是世界上最流行的开源关系型数据库管理系统之一&#xff0c;它以性能卓越、稳定可靠和易用性而闻名。MySQL 主要应用在 Web 开发、大型互联网公司、企业级应用等场景&#xff0c;且广泛用于构建高并发、高可用的数据…

工程师 - PFM介绍

在电子电路设计中&#xff0c;PFM&#xff08;Pulse Frequency Modulation&#xff0c;脉冲频率调制&#xff09;是一种调制技术&#xff0c;其主要特点是在负载变化时调整脉冲的频率&#xff0c;而保持脉冲的宽度&#xff08;时间长度&#xff09;相对恒定。与PWM&#xff08;…

记忆化搜索专题——算法简介力扣实战应用

目录 1、记忆化搜索算法简介 1.1 什么是记忆化搜索 1.2 如何实现记忆化搜索 1.3 记忆化搜索与动态规划的区别 2、算法应用【leetcode】 2.1 题一&#xff1a;斐波那契数 2.1.1 递归暴搜解法代码 2.1.2 记忆化搜索解法代码 2.1.3 动态规划解法代码 2.2 题二&#xff1…

Transformer预测 | 基于Transformer心率时间序列预测(tensorflow)

效果一览 基本介绍 Transformer预测 | 基于Transformer心率时间序列预测(tensorflow) 程序设计 import pandas as pd from pandas.plotting import lag_plot from statsmodels.graphics

加密与安全_优雅存储二要素(AES-256-GCM )

文章目录 什么是二要素如何保护二要素&#xff08;姓名和身份证&#xff09;加密算法分类场景选择算法选择AES - ECB 模式 (不推荐)AES - CBC 模式GCM&#xff08;Galois/Counter Mode&#xff09;AES-256-GCM简介AES-256-GCM工作原理安全优势 应用场景其他模式 和 敏感数据加密…

AIoT智能工控板

在当今竞争激烈的商业环境中&#xff0c;企业需要强大的科技力量来助力腾飞&#xff0c;AIoT智能工控板就是这样的力量源泉。 其领先的芯片架构设计&#xff0c;使得主板的性能得到了极大的提升。无论是数据的处理速度、图形的渲染能力&#xff0c;还是多任务的并行处理能力&a…

Ceph官方文档_01_Ceph简介

目录 Ceph介绍Ceph介绍 Ceph可用于向云平台提供Ceph对象存储,Ceph可用于向云平台提供Ceph块设备服务。Ceph可用于部署Ceph文件系统。所有Ceph存储群集部署开始都是先设置每个Ceph节点,然后再设置网络。 Ceph存储集群需要以下内容:至少一个Ceph监视器和至少一个Ceph管理器,…

毕业设计选题:基于ssm+vue+uniapp的捷邻小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

Linux top命令详解与重点内容说明

文章目录 重点说明基本信息进程(任务)信息cpu占用信息%Cpu(s)内存信息交换内存信息每列含义说明交互命令多窗口模式颜色配置命令参数 重点说明 top命令非常强大&#xff0c;也非常复杂&#xff0c;很难面面俱到&#xff0c;也没有必要&#xff0c;这篇文章的目的是介绍重点&am…

en造数据结构与算法C# 群组行为优化 和 头鸟控制

实现&#xff1a; 1.给鸟类随机播放随机动画使得每一只鸟扇翅膀的频率都不尽相同 2.可以自行添加权重&#xff0c;并在最后 sumForce separationForce cohesionForce alignmentForce;分别乘上相应权重&#xff0c;这样鸟就能快速飞行和转向辣 using System.Collections.Ge…