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

news2025/1/12 12:26:52

目录

前言

一、 32 位单精度浮点数在内存中的存储

1.1 - 符号位 sign

1.2 - 偏移后的指数位 biased exponent

1.3 - 尾数位 fraction(mantissa)

二、64 位双精度浮点数在内存中的存储

三、浮点数的比较



前言

计算机内部实际上只能存储和识别二进制,计算机中的文档、图片、数字等都是以二进制的形式存储在内存或硬盘中的。

IEEE(Institute of Electrical and Electronics Engineers,电气和电子工程师协会) 754 标准则提供了如何在计算机内存中以二进制的方式存储十进制浮点数的具体标准。


一、 32 位单精度浮点数在内存中的存储

1.1 - 符号位 sign

符号位占据最高位(第 31 位),用来表示这个浮点数是正数还是负数,其中 0 表示正数,1 则表示负数

例如,对于十进制浮点数 5.5,其存储在内存中时,符号位应为 0,而对于十进制浮点数 -5.5,符号位则应该为 1。  

1.2 - 偏移后的指数位 biased exponent

偏移后的指数位占据第 30 位到第 23 位的 8 位,用来表示以 2 为底的偏移后的指数。至于这个指数的作用,会在尾数位部分进行详解。

IEEE 754 规定,指数位用来表示 [-127, 128] 范围内的指数。不过为了表示方便,浮点数的指数位都有一个固定的偏移量(bias),使得"指数 + 偏移量 = 一个非负整数",这样指数位就不用为如何表示负数而担心了。规定:在 32 位单精度类型中,这个偏移量为 127

1.3 - 尾数位 fraction(mantissa)

尾数位占据第 22 位到第 0 位的剩余 23 位,用来存储尾数。

以二进制方式存储十进制浮点数时:

  1. 首先需要把十进制浮点数表示为二进制数。以十进制浮点数 5.5 为例:十进制浮点数 5.5 = 二进制数 101.1 --> 101.1 = 1 * 2^2 + 0 * 2^1 + 1 * 2^0 + 1 * 2^{-1} = 5.5

  2. 然后把这个二进制数表示为"尾数 * 2^指数"的形式。尾数的小数点放在第一位和第二位之间,然后保证第一位数为 1,这个处理过程叫做规范化(normalized)

    例如:101.1 = 1.011 * 2^2,其中 1.011 是尾数,指数 2 是偏移前的指数(unbiased exponent),加上偏移量后,得到的就是偏移后的指数(biased exponent) 129,它转换为二进制就是 1000 0001。

    还需要对尾数进行一些特殊处理

    (1) 隐藏最高位 1

    因为尾数的最高位,即第一位始终是 1,所以在存储尾数时,可以省略第一位的 1 和小数点,只存储小数点之后的部分,这样就节约了一位内存。

    所以,以后再提到尾数,如无特殊说明,指的其实是隐藏了第一位的 1 和小数点后,剩下的部分。

    (2) 低位补 0

    尾数不够填满尾数位时,就需要在低位补零,补齐 23 位。因为尾数中实际上存储的是二进制中的小数部分,所以在低位补零并不影响原数值。


二、64 位双精度浮点数在内存中的存储

64 位双精度浮点数在内存中的存储大同小异

在 64 位双精度类型中,偏移量是 1023


三、浮点数的比较

示例

#include <stdio.h>

int main()
{
	double epsilon = 0.001;  // ε
	double d1 = 2.334;
	double d2 = 2.335;
	printf("epsilon is %lf\n", epsilon);
	printf("d2 - d1 is %lf\n", d2 - d1);
	if ((d2 - d1) == epsilon)
	{
		printf("equal\n");
	}
	else
	{
		printf("unequal\n");
	}
	return 0;
}

程序运行后的结果

这表明浮点数在计算机中的存储不总是精确的,所以在判断两个浮点数是否相同时,通过采用比较两数之差的绝对值是否小于一个很小的数字来确定是否相等

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

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

相关文章

IPV6相关

目录 一、IPV6地址组成与专业术语 1.基础分类 2.本地链路地址范围区域概念 3.本地环回地址 二、centos配置IPV6地址 1.终端命令配置IPV6地址和网关 2.文件中配置IPV6地址 三、IPV6连通测试 1.全局单播地址进行ping 一、IPV6地址组成与专业术语 1.基础分类 IPv6基础知…

对话开发者:Serverless 落地的困境与破局

作者 | 阿里云开发者社区、InfoQ 从 2012 年提出 Serverless 到今年 2022 年刚好十年。 过去十年&#xff0c;上云是确定性趋势&#xff0c;在这个阶段企业一开始的关注点在于如何实现平滑上云。随着越来越多的企业上云&#xff0c;甚至很多企业系统第一天就是在云上构建&…

7-2 出生年

以上是新浪微博中一奇葩贴&#xff1a;“我出生于1988年&#xff0c;直到25岁才遇到4个数字都不相同的年份。”也就是说&#xff0c;直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求&#xff0c;自动填充“我出生于y年&#xff0c;直到x岁才遇到n个数字都不相同的…

【数据结构与算法——C语言版】5. 排序算法(1)——冒泡排序

前言 上篇文章【数据结构与算法——C语言版】4. 排序算法&#xff08;1&#xff09;——选择排序我们介绍了排序算法中的选择排序&#xff0c;其时间复杂度是O(n2)&#xff0c;本篇文章我们将介绍另一种同样时间复杂度是O(n2)的排序算法——冒牌排序&#xff0c;这两种算法思路…

面向对象编程看这一篇文章就够了

第一章 面向对象和面向过程 面向对象(OOP[Object Oriented Programming])和面向过程(POP[procedure oriented programming])都是一种软件编程设计思想 1. 面向过程强调功能行为 2. 面向对象是将功能封装进对象,强调具备了功能的对象 3. 面向对象强调运用人类在日常的思维逻辑中…

Java 程序员都该懂的 HashMap

HashMap 一直是非常常用的数据结构&#xff0c;也是面试中十分常问到的集合类型&#xff0c;今天就来说说 HashMap。 但是为什么要专门说明是 Java8 的 HashMap 呢&#xff1f;我们都知道&#xff0c;Java8 有很多大的变化和改动&#xff0c;如函数式编程等&#xff0c;而 Hash…

SpringBoot 请求参数处理详解

目录 请求参数处理 0、请求映射 1、rest使用与原理 1、普通参数与基本注解 1.1、注解&#xff1a; 1.2、Servlet API&#xff1a; 1.3、复杂参数&#xff1a; 1.4、自定义对象参数&#xff1a; 2、POJO封装过程 3、参数处理原理 1、HandlerAdapter 2、执行目标方法…

maplab2.0安装

项目链接: GitHub - ethz-asl/maplab: An open visual-inertial mapping framework. 安装流程很简单.按照github流程安装就行,建议使用脚本自动安装, 安装指南: https://maplab.asl.ethz.ch/docs/master/pages/installation/A_Installation-Ubuntu.html 值得注意的点包括: 1…

【阶段二】Python数据分析数据可视化工具使用03篇:词云图与相关性热力图

本篇的思维导图: 词云图 词云图(word cloud chart)是通过使每个字的大小与其出现频率成正比,显示不同单词在给定文本中的出现频率,然后将所有的字词排在一起,形成云状图案,也可以任何格式排列:水平线、垂直列或其他形状,也可用于显示获分配元数据的单词。在词云…

2022 OpenMLDB 硕果累累,颁奖台上荣耀连连

岁末年初&#xff0c; 既是回望过去和规划未来的日子&#xff0c; 也是总结成长与收获成果的时间。 2022 年即将结束之际&#xff0c; OpenMLDB 在颁奖台上惊喜连连&#xff0c; 获得了 IT168 和 中国开源云联盟 的认可。 技术改变世界&#xff0c;创新引领未来。业界知名 IT…

Redis缓存穿透、缓存击穿、缓存雪崩详解

缓存处理流程接收到查询数据请求时&#xff0c;优先从缓存中查询&#xff0c;若缓存中有数据&#xff0c;则直接返回&#xff0c;若缓存中查不到则从DB中查询&#xff0c;将查询的结果更新到缓存中&#xff0c;并返回查询结果&#xff0c;若DB中查不到&#xff0c;则返回空数据…

PSR规范

PSR规范 PSR 不是PHP官方标准&#xff0c;而是从如Zend、Symfony2等知名PHP项目中提炼出来的一系列标准&#xff0c;目前有越来越多的社区项目加入并遵循该标准。 PSR-0 自动加载 X已废弃 PSR-1 基本代码规范 PSR-2 代码样式 PSR-3 日志接口 PSR-4 如何指定文件路径从而自动加载…

怎么搭建自己的网站赚钱,个人网站怎么操作

大家好&#xff0c;我是蝶衣王的小编接触过互联网的应该很多都想过能不能搭建自己的网站赚钱&#xff0c;无论是用来带货&#xff0c;引流&#xff0c;还是做广告都会是一笔不错的收入&#xff0c;而且网站做好之后打理起来简单&#xff0c;后期工作量也是比较小的&#xff0c;…

【论文简述】Vis-MVSNet: Visibility-Aware Multi-view Stereo Network(IJCV 2022)

一、论文简述 1. 第一作者&#xff1a;Jingyang Zhang 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;IJCV、BMVC 4. 关键词&#xff1a;MVS、可见性、MVSNet 5. 探索动机&#xff1a;MVS的可见性 One critical factor in MVS is the pixel-wise visibility: whet…

Clion配置导致中文乱码问题 char长度限制导致中文乱码问题

&#x1f370; 个人主页:__Aurora__ &#x1f35e;如果文章有什么需要改进的地方还请各位大佬指正。 &#x1f349;如果我的文章对你有帮助➡️ 关注&#x1f64f;&#x1f3fb; 点赞&#x1f44d; 收藏⭐️ 问题1&#xff1a;中文乱码问题&#xff08;配置原因&#xff09; #…

【Linux】复制进程、了解逻辑地址以及写实拷贝

目录 fork()方法原型 父子进程 父子进程的pid 物理地址和逻辑地址 写实拷贝 fork()方法原型 pid_t fork(void); pid_t是int类型代表进程的pid号 Linux内核2.4.0定义&#xff1a; typedef int __kernel_pid_t; typedef __kernel_pid_t pid_t; 每一个进程的pid都是唯一…

MySQL多实例管理(mysqld_multi)

定义&#xff1a;就是在一台mysql机器上开启多个不同的服务端口&#xff08;如&#xff1a;3306,3307&#xff09;&#xff0c;运行多个MySQL服务进程&#xff0c;通过不同的socket监听不同的服务端口来提供各自的服务 1.MySQL多实例介绍 1.1.什么是MySQL多实例 MySQL多实例就…

移动智能终端安全技术要求及测试评价方法

声明 本文是学习移动智能终端安全技术要求及测试评价方法. 下载地址 http://github5.com/view/627而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 移动智能终端测试评价方法 硬件安全 硬件安全的测试方法、预期结果和结果判定如下&#xff1a; a&am…

版本控制 | 一文了解虚拟制作,进入影视制作新赛道

作为一种能够引领未来趋势&#xff0c;颠覆影视制作流程的全新技术&#xff0c;虚拟制作已经慢慢普及到影视制作领域。嗅觉灵敏的资本和目光前瞻的大厂纷纷布局虚拟制作赛道。阅读本篇文章&#xff0c;您将了解到什么是虚拟制作&#xff0c;它的优势所在、如何开展虚拟制作以及…

SpreadJS 16.0.1 中英版 SpreadJS-EN-CN

SpreadJS具有 500 多个 Excel 函数的完整 Angular 电子表格解决方案 快速提供真正类似 Excel 的电子表格体验 - 对 Excel 零依赖。创建财务报告和仪表板,预算和预测模型&#xff0c;科学&#xff0c;工程&#xff0c;卫生保健,教育,科学实验室和更多。 Ω578867473创建自定义电…