C语言之浮点数_数据存储篇(2)

news2025/1/12 22:55:23

目录

浮点数

什么是浮点数呢?

为什么叫浮点数? 

浮点数家族

浮点数表示的范围?

浮点数存储的例子

浮点数的存储方式

写成规定形式是怎样的?

那SME在内存中如何分配的呢?

为什么要这样存储?

浮点数从内存中取出方式

E不全为1也不全为0

E全为0

E全为1

例子解释

思维导图


浮点数

什么是浮点数呢?

3.1415926           1E10

为什么叫浮点数? 

1.23=12.3*10^-1=0.123*10^-1

小数点可以浮动,所以叫浮点数。

浮点数家族

浮点数家族包括:float,double,long double类型。

浮点数表示的范围?

浮点数表示的范围:float.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 * 2^E
  • (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
  • M表示有效数字,大于等于1,小于2。(1<=M<=2)
  • 2^E表示指数位。

二进制          整数     .    小数 
1    1   1    1    1    .    1     1
2^4 2^3  2^2  2^1  2^0  .   2^-1   2^-2

写成规定形式是怎样的?

十进制:5.5
二进制:101.1

二进制:101.1

(-1)^0  *  1.011 *  2^2 

S=0

M=1.011

E=2

十进制:9.0
二进制:1001.0

二进制:1001.0

(-1)^0 * 1.001 *  2^3

S=0

M=1.001

E=3

那SME在内存中如何分配的呢?

  IEEE 745规定:

  • 对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下23位为有效数字M
  • 对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下52位有效数字M

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

  • 有效数字M,写成1.XXXXXXXXXXXX,取值范围1<=M<=2,有效数字是指舍去1,只包括XXXXXXXXX的小数部分。
  • 指数E,E为一个无符号整数(unsigned int)。如果E为8位,取值范围为0~225;如果E为11位,取值范围为0~2047

单精度浮点数存储 

 双精度浮点数存储

为什么要这样存储?

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

IEEE 745规定,在计算机内部保存M时候,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxxx的部分。

比如:保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。

这样做的目的是:节省1位的有效数字。

比如:32位浮点数,留给M只有23位,将第一位的1舍去之后,可以保存24位有效数字。

至于指数E。E是一个无符号整数。我们知道,科学计数法中的E是可以出现负数的。所以IEE754规定,存入内存时E的真实值必须再加上一个中间值。

  • 对于8位的E,这个中间值是127。所以E为8位的取值范围:0~225
  • 对于11位的E,这个中间值是1023。所以E位11位的取值范围:0~2047

比如:2^10的E是10,所以保存成32位的浮点数时,必须保存成10+127=137,即10001001

 看个例子

#include<stdio.h>
int main()
{
	float f = 5.5;
	return 0;
}
#include<stdio.h>
int main()
{
	float f = 5.5;
	//5.5
	//101.1
	//(-1)^0 * 1.011 * 2^2
	//S=0
	//M=1.011
	//E=2
    //E=127+2=129
	// S E M
	//0 10000001 01100000000000000000000
	//0100 0000 1011 0000  0000 0000  0000 0000
	//     40         b0          00         00
	return 0;
}

浮点数从内存中取出方式

MS数据都是按照存进去的方式取出来。但是,指数E从内存中取出来还可以分三种情况

E不全为1也不全为0

指数E的计算值减去127(或1023),得到真实值,再将有效位数字M前加上第一位的1。

E全为0

浮点数的指数E等于-127(或-1023)即为真实值,有效数字M不用加上第一位的1,而是还原为0.xxxxxxxxx的小数。这样做是为了表示+0/-0,以及接近于0的很小的数字。

E全为1

这时,如果有效数字M全为0,表示+-无穷大(正负取决于符号位S)。 

例子解释

//浮点数
#include<stdio.h>
int main()
{
	int n = 9;
	//站在整型角度
	//00000000 00000000 00000000 00001001原反补
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n);//9
	printf("*pFloat的值为:%f\n", *pFloat);//0.00000000
	//站在浮点数的角度
	//00000000 00000000 00000000 00001001
	//0 00000000 00000000000000000001001
	//S=0
	//E=-126
	//M=0.0000000000000000001001
	//(-1)^0 * 0.00000000000000000001001 * 2^-126
	*pFloat = 9.0;
	printf("num的值为:%d\n", n);//1091567616
	//9.0
	// (-1)^0 * 1.0010 * 2^3 
	//S=0
	//M=1.0010
	//E=3
	// E=127+3=130
	//0 10000010 00100000000000000000000
	//0100 0001 0001 0000 0000 0000 0000
	printf("*pFloat的值为:%f\n", *pFloat);//9.0
	return 0;
}

思维导图

 

✔✔✔✔✔最后,感谢大家的阅读,若有不足和错误,欢迎指正!

代码----------------→【gitee:https://gitee.com/TSQXG】

联系----------------→【邮箱:2784139418@qq.com】

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

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

相关文章

44、TCP报文(二)

接上节内容&#xff0c;本节我们继续TCP报文首部字段含义的学习。上节为止我们学习到“数据偏移”和“保留”字段。接下来我们学习后面的一些字段&#xff08;暂不包含“检验和”的计算方法和选项字段&#xff09;。 TCP首部结构&#xff08;续&#xff09; “数据偏移”和“保…

人工智能在车牌识别中的应用与影响

引言&#xff1a;车牌识别技术是基于人工智能的一种重要应用&#xff0c;通过对监控视频中的车辆图像进行处理和分析&#xff0c;可以快速、准确地识别车牌号码。这项技术的广泛应用可以帮助交通管理、停车场管理&#xff0c;甚至追踪犯罪嫌疑人的车辆。本文将详细探讨车牌识别…

从LeakCanary看ViewModel生命周期监控

前面两篇文章中已经了解了LeakCanary中Service和Fragment生命周期监控的实现&#xff0c;那么ViewModel生命周期监控又是怎么实现的呢&#xff1f; 同样的&#xff0c;要了解ViewModel生命周期监控&#xff0c;我们首先应该清楚在代码结构中ViewModel是如何存储获取的&#xf…

【零基础自用】理解python为什么要用虚拟环境

不知道学过MATLAB或者R的小伙伴刚刚接触python的时候会不会被各种python版本&#xff0c;包版本&#xff0c;虚拟环境之类的搞的头晕眼花。 问题一 包版本 先来假设&#xff0c;我们自己开发了一个包MyPackage 1.0&#xff0c;里面包含一个模块叫PreTrained&#xff0c;然后去…

Python爬虫(十三)_案例:使用XPath的爬虫

本篇是使用XPath的案例 案例&#xff1a;使用XPath的爬虫 现在我们用XPath来做一个简单的爬虫&#xff0c;我们尝试爬取某个贴吧里的所有帖子且将该帖子里每个楼层发布的图片下载到本地。 #-*- coding:utf-8 -*- #tieba_xpath.py"""作用&#xff1a;本案例使用…

【AGC】Publishing api怎么上传绿色认证审核材料

【问题描述】 华为应用市场会对绿色应用标上特有的绿色标识&#xff0c;代表其通过华为终端开放实验室DevEco云测平台的兼容性、稳定性、安全、功耗和性能的检测和认证&#xff0c;是应用高品质的象征。想要自己的应用认证为绿色应用就需要在发布应用时提供绿色认证审核材料&a…

Go语言基础之基本数据类型

Go语言中有丰富的数据类型&#xff0c;除了基本的整型、浮点型、布尔型、字符串外&#xff0c;还有数组、切片、结构体、函数、map、通道&#xff08;channel&#xff09;等。Go 语言的基本类型和其他语言大同小异。 基本数据类型 整型 整型分为以下两个大类&#xff1a; 按…

echarts 关于折线统计图常用的属性设置--超详细(附加源码)

文章目录 折线统计图设置x轴字体大小及字体颜色设置y轴字体大小及字体颜色设置背景颜色及设置折线颜色设置折线效果图显示阴影折线图位置及标签位置设置鼠标悬浮折线弹出窗口显示对应的数据设置自动横向滚动 总结 大家好&#xff01;近期我会分享几篇关于echarts方面的技术点&a…

easy-es 使用

1、pom中引入依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.14.0</version></dependency><dependency><groupId>org.…

CentOS ens160 显示disconnected

使用nmcli device查看网卡状态&#xff0c;显示如图&#xff1a; 检查宿主机系统VMware DHCP Sevice和VMware NAT Sevice服务是否正常运行。 右键点击我的电脑管理按钮&#xff0c;打开计算机管理点击服务

C语言实例_异或校验算法

一、异或校验算法 异或校验算法&#xff08;XOR校验&#xff09;是一种简单的校验算法&#xff0c;用于检测数据在传输或存储过程中是否发生了错误。通过将数据中的所有比特位相异或&#xff0c;生成一个校验码&#xff0c;然后将该校验码与接收到的数据进行比较&#xff0c;以…

如何大幅提高遥感影像分辨率(Python+MATLAB)

前言: 算法:NSCT算法(非下采样变换) 数据:Landsat8 OLI 遥感图像数据 编程平台:MATLAB+Python 论文参考:毛克.一种快速的全色和多光谱图像融合算法[J].测绘科学,2016,41(01):151-153+98.DOI:10.16251/j.cnki.1009-2307.2016.01.028. 左图:未进行融合的多光谱真彩色合…

ChatGPT逐句逐句地解释代码并分析复杂度的提示词prompt

前提安装chrome 插件 AI Prompt Genius&#xff0c; 请参考 3 个 ChatGPT 插件您需要立即下载 你是首席软件工程师。请解释这段代码&#xff1a;{{code}} 添加注释并重写代码&#xff0c;用注释解释每一行代码的作用。最后分析复杂度。快捷键 / 选择 Explain Code 输入代码提…

内网隧道代理技术(十七)之 NPS的使用

NPS的介绍和使用 NPS介绍 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,…

RFID技术助力汽车零配件装配产线,提升效率与准确性

随着科技的不断发展&#xff0c;越来越多的自动化设备被应用到汽车零配件装配产线中。其中&#xff0c;射频识别&#xff08;Radio Frequency Identification&#xff0c;简称RFID&#xff09;技术凭借其独特的优势&#xff0c;已经成为了这一领域的重要技术之一。本文将介绍RF…

Cpp基础Ⅰ之编译、链接

1 C是如何工作的 工具&#xff1a;Visual Studio 1.1 预处理语句 在.cpp源文件中&#xff0c;所有#字符开头的语句为预处理语句 例如在下面的 Hello World 程序中 #include<iostream>int main() {std::cout <"Hello World!"<std::endl;std::cin.get…

宝塔部署Java+Vue前后端分离项目经验总结

前言 之前部署服务器都是在Linux环境下自己一点一点安装软件&#xff0c;听说用宝塔傻瓜式部署更快&#xff0c;这次浅浅尝试了一把。 确实简单&#xff01; 1、 买服务器 咋买服务器略&#xff0c;记得服务器装系统就装 Cent OS 7系列即可&#xff0c;我装的7.6。 2、创建…

私密数据采集:隧道爬虫IP技术的保密性能力探究

作为一名专业的爬虫程序员&#xff0c;今天要和大家分享一个关键的技术&#xff0c;它能够为私密数据采集提供保密性能力——隧道爬虫IP技术。如果你在进行敏感数据采集任务时需要保护数据的私密性&#xff0c;那么这项技术将是你的守护神。 在进行私密数据采集任务时&#xff…

曲面(弧面、柱面)展平(拉直)瓶子标签识别ocr

瓶子或者柱面在做字符识别的时候由于变形&#xff0c;识别效果是很不好的 或者是检测瓶子表面缺陷的时候效果也没有展平的好 下面介绍两个项目&#xff0c;关于曲面&#xff08;弧面、柱面&#xff09;展平&#xff08;拉直&#xff09; 项目一&#xff1a;通过识别曲面的6个点…