IEEE754 标准存储浮点数
1. IEEE754 标准简介
IEEE754 标准是一种用于浮点数表示和运算的标准,由国际电工委员会(IEEE)制定。它定义了浮点数的编码格式、舍入规则以及基本的算术运算规则,旨在提供一种可移植性和一致性的方式来表示和处理浮点数
IEEE754 标准定义了两种常见的浮点数格式:单精度(32位)和双精度(64位)。这些格式使用了符号、阶码(指数)、尾数的二进制表示形式,其中符号表示浮点数的正负,指数表示浮点数的数量级,而尾数表示浮点数的精度。同时,IEEE754 标准还定义了特殊值,如正无穷大、负无穷大和 NaN(非数值)
IEEE754 标准还规定了浮点数的四种基本算术运算:加法、减法、乘法和除法。这些运算遵循一定的舍入规则,以确保结果在浮点数表示范围内具有最佳的精度和准确性
使用 IEEE754 标准可以提供一种统一的浮点数表示和运算方式,使得不同的计算机和编程语言之间可以进行浮点数数据的可靠交换和计算。需要注意的是,IEEE754 标准仍然存在一些舍入误差和精度限制,因此在进行浮点数运算时需要小心处理,并考虑数值精度可能导致的误差问题
2. float 的存储方式
float 占用 32 位的存储空间,32 位被分为了如下的三个部分,各个部分所占的位数如下图所示,右边为低位

- 符号位:符号位为 0 说明该浮点数为正数,若为 1 则说明浮点数为负数
- 阶码:代表该浮点数被二进制科学表示法规范化后的指数,阶码采用移码表示,后面会有具体的例子进行讲解
- 尾数:被二进制规格化后要求小数点前一位数必须为 1,由于所有的浮点数都采用这样的方式进行处理,所以尾数中实际隐含了最高位 1,例如尾数为 M,则实际在还原时,相当于是 1.M,后面会有具体的例子进行讲解
设一个浮点数的符号存储的二进制为 s,阶码为 E,尾数为 M
则存储的该浮点数为:(-1)s×1.M×2E-偏置值,在单精度浮点数中,该偏置值为127
还需要注意的是,在 IEEE754 中,阶码全 0 和全 1 的情况被列为了特殊情况(后面的小节会讲到),所以阶码实际可以使用的范围为 1~254
2.1 浮点数如何转为 IEEE754 标准
例如现在有十进制数:85.125
其中整数部分为:85,对应二进制为 101 0101
小数部分为:0.125,对应二进制为 001
所以 85.125 对应的二进制就为:101 0101.001
规范化后:1.010101001 x 2^6
符号位为:0
阶码:6+127(偏置值)= 133
对应二进制为:133 = 10000101
尾码:010101001(注意这里的尾码实际上没有包含最高位的 1),由于这里没有 23 位,后续会补 0 直到尾码有 23 位
IEEE754 标准下的存储二进制为:
| 符号(1位) | 阶码(8位) | 尾数(23位) |
|---|---|---|
| 0 | 1000 0101 | 010 1010 0100 0000 0000 0000 |
对应的十六进制数为:42 AA 40 00
2.2 IEEE754 标准如何转化为浮点数
现有符合 IEEE754 标准的以十六进制存储的浮点数:C1 51 00 00
转为二进制数然后将每一位与之含义对应:
| 符号(1位) | 阶码(8位) | 尾数(23位) |
|---|---|---|
| 1 | 1000 0010 | 101 0001 0000 0000 0000 0000 |
其中:
s = 1
M = 101 0001 0000 0000 0000 0000 对应十进制为:.6328125(需要注意的是,这里的数值代表的是小数点后面的数值)
E = 1000 0010 对应的十进制为 130
然后我们带入上面给出的公式中 (-1)1×1.6328125×2130-127 = -1.6328125×23 = -1.6328125×8 = -13.0625
所以 C1 51 00 00 所代表的浮点数就是 -13.0625
3. double 的存储方式
double 占用 64 位的存储空间,64 位被分为了如下的三个部分,各个部分所占的位数如下图所示,右边为低位

双精度浮点数中,该偏置值为1023,阶码实际可以使用的范围为 1~2046。其余的存储方式与 float 是一样的,这里就不再赘述
4. IEEE754 制定的特殊值
当阶码全为 0:
- 尾数 M 不全为 0 时,表示非规格化小数:±(0.xxx…xx)×2-126
- 尾数 M 全为 0 时,表示真值 ±0
当阶码全为 1:
- 尾数 M 全为 0:表示无穷大
- 尾数 M 不全为 0:表示数值“NAN”,如
0/0、∞-∞等
4.1 浮点数的存储范围
有了前面小节的铺垫,相信很容易可以求出来 float 的存储范围了,首先来寻找 float 可以表示的最大值(无穷除外):
让符号为 0,阶码为 254,尾数全部为 1,这样我们可以得到下面的二进制
| 符号(1位) | 阶码(8位) | 尾数(23位) |
|---|---|---|
| 0 | 1111 1110 | 111 1111 1111 1111 1111 1111 |
带入公式:(-1)0×(2-2-23)×2254-127 =(2-2-23)×2127 = 2128-2104
这个就是 float 可以表示的最大的值,只要加上负号就是它可以表示的最小的值
但这还不是我们的目标,根据上面的学习我们知道了 float 在靠近 0 的地方其实会有很多的数字不能表示到,那么他可以表示的最小/大的规范化正/负数是多少呢?
我们来考虑在什么情况下,float 可以取到最小规范化正数的值:
让符号为 0,阶码为 1,尾数全部为 0,这样我们可以得到下面的二进制
| 符号(1位) | 阶码(8位) | 尾数(23位) |
|---|---|---|
| 0 | 0000 0001 | 000 0000 0000 0000 0000 0000 |
带入公式:(-1)0×1.0×21-127 =2-126
这个就是 float 可以表示的最小规范化正数的值,只要加上负号就是它可以表示的最大规范化负数的值
double类型可以根据上面的方法如法炮制,这里就不再赘述,具体的范围可以参考下面的表格
| 格式 | 最小正值 | 最大正值 |
|---|---|---|
| float | 2-126 | (2-2-23)×2127 |
| double | 2-1022 | (2-2-52)×21023 |
| 格式 | 最大负值 | 最小负值 |
|---|---|---|
| float | (2-23-2)×2127 | -2-126 |
| double | (2-52-2)×21023 | -2-1022 |
根据上面的表格可以看到浮点数并不是连续的表示数轴上的数(准确的说浮点数本身就只能间断的表示某一些数,但是我这里所说间断指的是在一大段的范围内,浮点数都是无法表示的,比如 float 类型从 0~2-126 这一段的数字它就无法进行表示),可以参考下面的图示

当发生下溢时,会被当做机器零处理,发生上溢时,会被当做无穷来处理
IEEE754 还制定了浮点数运算的规则,有兴趣的读者可以自行查阅,本文就不做说明了
相关文章:
IEEE754 标准存储浮点数
1. IEEE754 标准简介 IEEE754 标准是一种用于浮点数表示和运算的标准,由国际电工委员会(IEEE)制定。它定义了浮点数的编码格式、舍入规则以及基本的算术运算规则,旨在提供一种可移植性和一致性的方式来表示和处理浮点数 IEEE754 …...
CSS 两栏布局
目录 CSS两栏布局(左列定宽,右列自适应宽) 方法一:浮动margin 方法二:定位margin 方法三:浮动BFC 方法四:Flex布局 方法五:able布局 CSS两栏布局(左列不定宽&#…...
RHCSA常用命令总结
RHCSA回顾 1.Linux学习环境的安装部署 VMware虚拟机rhel9.x 磁盘容量:20GB cpu:1颗2核心 内存:2G 网卡:NAT 新CD/DVD设置镜像源文件 取消显示器的3d支持 (1)安装RHEL9 (2)组件:带有GUI的服务器 (3)分区…...
【Spring Boot】详解restful api
目录 1.restful api 1.1.历史 1.2.内容 1.3.传参 2.Spring Boot中的Restful Api 1.restful api 1.1.历史 RESTful API(Representational State Transferful Application Programming Interface)是一种设计风格,用于构建基于网络的应用…...
LISTAGG 函数
# LISTAGG 函数 对于查询中的每个组,LISTAGG 聚合函数根据 ORDER BY 表达式对该组的行进行排序,然后将值串联成一个字符串。 ## 语法: sql LISTAGG( [DISTINCT] aggregate_expression [, delimiter ] ) [ WITHIN GROUP (ORDER BY order_list) ] …...
485modbus转profinet网关连三菱变频器modbus通讯配置案例
本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式,使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关,用户可以有效地管理和监控设备,从…...
1024节日
程序员节日...
【@EnableWebMvc的原理】
用途 启用SpringMvc 的 Java 配置类,代替 xml 格式的配置文件。 一、查看运用(注解 EnableWebMvc ,实现 WebMvcConfigurer ) Component("com.ibicd") EnableWebMvc public class AppConfig implements WebMvcConfigu…...
css3 2d转换transform详细解析与代码实例transform
CSS3 Transform是CSS3的一个模块,其目的是为了通过对元素的变形、旋转、缩放、平移等操作,能够更加丰富的展示页面效果。下面是CSS3 Transform的详细解析与代码实例: transform属性 transform属性用于对元素进行变形操作,其属性…...
点亮现代编程语言的男人——C语言/UNIX之父Dennis Ritchie
祝各位程序员们1024程序员节快乐🎉🎉🎉 图片来自网络,侵删 前言 在程序员中,有一位人物的不被人熟知,他的贡献甚至比他自身更要出名 C语言之父,UNIX之父——Dennis MacAlistair Ritchie 一…...
找不到msvcp100.dll解决教程
在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp100.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题,本文将介绍四个修复msvcp100.dll丢失的方法,帮助读者快速恢复计算机的正常运…...
萃取和constexpr
最近重温了一下萃取发现其与constexpr有相似之处,记录如下。 一、引出萃取 STL的在中心思想是将容器和算法分开,再通过迭代器iterator这一迭代器来将两者粘合起来。 通过迭代器进行算法计算,需要涉及两个问题: 问题一.通常需要…...
决策树完成图片分类任务
数据集要求: 训练集 和 验证集 (要求分好) 图片放置规则 : 一个总文件夹 放类别名称的子文件夹 其中子文件夹 为存放同一类别图片 举个例子 分类动物 则 总文件夹名称为动物 子文件夹为 猫 狗 猪猪 。。。 其中猫的文件夹里面…...
Docker 容器全部停止命令
Docker是一个开源的容器化平台,它可以帮助开发者快速构建、部署和运行应用程序。在使用Docker时,我们通常会创建多个容器来运行不同的服务或应用。当我们需要停止所有的容器时,可以使用一些命令来实现。本文将介绍几种常见的停止所有Docker容…...
对GRUB和initramfs的小探究
竞赛时对操作系统启动过程产生了些疑问,于是问题导向地浅浅探究了下GRUB和initramfs相关机制,相关笔记先放在这里了。 内核启动流程 在传统的BIOS系统中,计算机具体的启动流程如下: 电源启动:当计算机的电源打开时&…...
springboo单机多线程高并发防止重复消费的redis方案
springboo单机多线程高并发防止重复消费的redis方案 仅提供方案与测试。 想法:第一次收到userCode时,检查是否在redis中有,如果有,就表明已经消费了,返回抢单失败;否则,就去消费,顺…...
Java架构师内功数据库
目录 1 导学2 数据库基本概念2.1 数据库系统2.2 三级模式-两级映像2.3 数据库设计2.4 数据模型2.4.1 E-R模型2.4.2 关系模型2.5 关系代数3 规范化和并发控制3.1 函数依赖3.2 键与约束3.3 范式3.3.1 第一范式1NF3.3.2 第二范式3.3.3 第三范式3.4 模式分解3.5 并发控制3.6 封锁协…...
踩着节日的小尾巴
节日快乐...
UG\NX二次开发 设置视图中心 UF_VIEW_set_center
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 a1794902437 订阅本专栏,非常感谢。 简介 UG\NX二次开发 设置视图中心 UF_VIEW_set_center。如果视图NULL_TAG,则使用工作视图。 效果 代码 #include &qu…...
leetcode做题笔记201. 数字范围按位与
给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。 示例 1: 输入:left 5, right 7 输出:4示例 2: 输入&…...
Google Cloud Vision API:为什么你的应用需要“看懂”图片的超能力?
Google Cloud Vision API:为什么你的应用需要“看懂”图片的超能力? 【免费下载链接】cloud-vision Sample code for Google Cloud Vision 项目地址: https://gitcode.com/gh_mirrors/cl/cloud-vision 你是否曾想过,如果应用能像人类一…...
利用SoftEther实现跨平台虚拟私有网络部署指南
1. SoftEther简介与核心优势 如果你正在寻找一款能同时在Windows、Linux、Mac、Android和iOS上运行的虚拟私有网络解决方案,SoftEther绝对值得深入了解。这个源自日本筑波大学的开源项目,经过多年发展已经成为支持协议最全面的跨平台工具之一。我第一次…...
深入理解MUNIT架构:内容编码器与风格编码器的完美结合
深入理解MUNIT架构:内容编码器与风格编码器的完美结合 【免费下载链接】MUNIT Multimodal Unsupervised Image-to-Image Translation 项目地址: https://gitcode.com/gh_mirrors/mu/MUNIT MUNIT(Multimodal Unsupervised Image-to-Image Translat…...
XUnity.AutoTranslator实用指南:高效实现Unity游戏实时翻译
XUnity.AutoTranslator实用指南:高效实现Unity游戏实时翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 在全球化游戏市场中,语言障碍常常成为玩家体验优质游戏的最大阻碍。XUn…...
IDA Pro高效操作:快捷键全解析与实战应用
1. 逆向工程中的效率革命:为什么快捷键如此重要 刚接触逆向分析时,我总被同事的操作速度震惊——他们不用鼠标就能在IDA里快速跳转、标记数据、切换视图。直到发现他们都在用快捷键组合,我才明白效率差距的关键。逆向工程本质上是与二进制代码…...
Nano-Banana在.NET开发中的应用:智能业务逻辑实现
Nano-Banana在.NET开发中的应用:智能业务逻辑实现 将AI能力无缝集成到企业级应用中,让智能业务逻辑开发变得简单高效 1. 开篇:当.NET遇见AI智能业务逻辑 如果你正在开发.NET企业级应用,可能会遇到这样的场景:需要智能…...
LVGL8实战:打造个性化数字密码键盘界面
1. 为什么需要自定义密码键盘 在智能家居控制面板、金融支付终端这类对安全性要求较高的场景中,系统自带的软键盘往往存在两个致命问题:一是界面风格与产品整体设计语言不协调,二是可能存在输入轨迹泄露的风险。去年我给某智能门锁厂商做方案…...
在WSL中一键部署Phi-4-mini-reasoning:Windows开发者的Linux模型推理环境搭建
在WSL中一键部署Phi-4-mini-reasoning:Windows开发者的Linux模型推理环境搭建 1. 为什么选择WSL部署Phi-4-mini-reasoning 对于习惯Windows环境的开发者来说,直接在本地运行Linux环境下的AI模型往往是个挑战。Windows Subsystem for Linux (WSL) 提供了…...
Spire.Doc转PDF授权限制解析与解决方案
1. Spire.Doc转PDF的三页限制是怎么回事 第一次用Spire.Doc转换PDF时,我盯着生成的3页文档愣了半天——明明50页的Word文件,怎么输出就只剩个开头了?后来查文档才发现,这是未授权版本的硬性限制。就像试用版软件经常会有功能阉割&…...
OpenClaw定时任务:千问3.5-9B每日早报自动推送
OpenClaw定时任务:千问3.5-9B每日早报自动推送 1. 为什么需要自动化早报推送 每天早上打开电脑第一件事,就是手动收集行业新闻、技术动态和日程提醒,再整理成早报发到团队群。这种重复劳动持续三个月后,我开始思考:能…...
