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位)
01000 0101010 1010 0100 0000 0000 0000

对应的十六进制数为:42 AA 40 00

2.2 IEEE754 标准如何转化为浮点数

现有符合 IEEE754 标准的以十六进制存储的浮点数:C1 51 00 00
转为二进制数然后将每一位与之含义对应:

符号(1位)阶码(8位)尾数(23位)
11000 0010101 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位)
01111 1110111 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位)
00000 0001000 0000 0000 0000 0000 0000

带入公式:(-1)0×1.0×21-127 =2-126
这个就是 float 可以表示的最小规范化正数的值,只要加上负号就是它可以表示的最大规范化负数的值
double类型可以根据上面的方法如法炮制,这里就不再赘述,具体的范围可以参考下面的表格

格式最小正值最大正值
float2-126(2-2-23)×2127
double2-1022(2-2-52)×21023
格式最大负值最小负值
float(2-23-2)×2127-2-126
double(2-52-2)×21023-2-1022

根据上面的表格可以看到浮点数并不是连续的表示数轴上的数(准确的说浮点数本身就只能间断的表示某一些数,但是我这里所说间断指的是在一大段的范围内,浮点数都是无法表示的,比如 float 类型从 0~2-126 这一段的数字它就无法进行表示),可以参考下面的图示
在这里插入图片描述

当发生下溢时,会被当做机器零处理,发生上溢时,会被当做无穷来处理
IEEE754 还制定了浮点数运算的规则,有兴趣的读者可以自行查阅,本文就不做说明了

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

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

相关文章

tcp/ip协议和opc协议对比详解

TCP/IP协议和OPC协议是两种重要的网络协议,它们在不同的网络层级上运行,并为数据传输和通信提供了不同的功能。 TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/互联网协议)是互联网通信的…

基于DF模式的协作通信技术matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、DF概述 4.2、DF基本原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2013b 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd))…

Postman —— postman的介绍和安装

Postman的介绍 Postman 是一款谷歌开发的接口测试工具,使API的调试与测试更加便捷。 它提供功能强大的 Web API & HTTP 请求调试。它能够发送任何类型的HTTP 请求 (GET, HEAD, POST, PUT..),附带任何数量的参数 headers postman是一款支持http协议的接口调试与…

OpenHarmony 持久化存储 UI 状态:PersistentStorage

前两个小节介绍的 LocalStorage 和 AppStorage 都是运行时的内存,但是在应用退出再次启动后,依然能保存选定的结果,是应用开发中十分常见的现象,这就需要用到 PersistentStorage。 PersistentStorage 是应用程序中的可选单例对象…

react|redux状态管理

react|redux状态管理 参考官网:https://cn.redux-toolkit.js.org/tutorials/quick-start 状态管理使用流程 1、安装: npm install react-redux reduxjs/toolkit2、创建store.js 通过configureStore的hook对reducer(或slice)进行…

Linux 内核的 current

1. 进程结构体 task_struct 是描述 Linux 进程的一个结构体,记录着进程的信息 // include/linux/sched.h struct task_struct {volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */void *stack;atomic_t usage;unsigned int flags; /* per proc…

DAOS学习笔记及思考

DAOS带来的思考 根据daos docs的描述,DAOS是Intel基于NVMe全新设计开发并开源的异步对象存储,充分利用下一代NVMe技术的优势,对外提供KV存储接口,提供非阻塞事物I/O,端到端完整性,细粒度的数据控制&#x…

Unity的Camera类——视觉掌控与深度解析(上)

前言 摄像机在任何3D场景中都是至关重要的元素,尤其是在游戏和实时应用中。它定义了玩家和用户如何“看到”虚拟世界。Unity中的Camera类提供了一系列强大的工具,让开发者可以精细地控制渲染和视图。在本文中,我们将深入探索这个核心类的使用…

【Java】小计 TCP UDP的区别

面向连接 TCP面向连接,需要连接,而UDP不需要建立连接 可靠性 TCP协议通过确认应答、连接管理、流量控制、拥塞控制来确保可靠性传输;UDP不保证可靠性传输。 性能 TCP传输效率慢,需要较多的资源开销,UDP传输效率快&am…

某马机房预约系统 C++项目(二) 完结

8.4、查看机房 8.4.1、添加机房信息 根据案例&#xff0c;我们还是先在computerRoom.txt中直接添加点数据 //几机房 机器数量 1 20 2 50 3 1008.4.2、机房类创建 ​ 同样我们在头文件下新建一个computerRoom.h文件 添加如下代码&#xff1a; #pragma once #include<i…

pnp单目相机标定测距

参考&#xff1a;opencv 单目相机pnp测距&#xff08;Cpp&#xff09;-CSDN博客

【python】文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;但是这里我们并不浪费笔墨介绍这个概念&#xff0c;请大…

凉鞋的 Godot 笔记 204. 语句

204. 语句 在上一篇&#xff0c;我们接触了三种常见的类型&#xff0c;如下所示&#xff1a; 这样我们算是对变量进行了一个入门了。 其实我们除了变量&#xff0c;我们还接触了一个叫做语句的概念。 我们可以看下代码: extends Node# Called when the node enters the sce…

IDEA配置HTML和Thymeleaf热部署开发

IDEA配置HTML和Thymeleaf热部署开发 1.项目配置2. IDEA配置3. 使用 需求&#xff1a;现在我们在开发不分离项目的时候&#xff08;SpringBootThmeleaf&#xff09;经常会改动了类或者静态html文件就需要重启一下服务器&#xff0c; 这样不仅时间开销很大&#xff0c;而且经常重…

PageHelper基础知识

使用场景 便用mybatis&#xff0c;可以用 pagehelper 分页 。 maven依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>4.1.6</version> </dependency>PageHelper配…

webpack配置css-loader让scss文件支持模块化引入

1. webpack部分: 重点: modules: true, // 为false引入就是空对象, 无法使用 const path require(path) const webpack require(webpack) const webpackCommonConf require(./webpack.common.js) const { smart } require(webpack-merge) const { srcPath, distPath } r…

@Value注解的原理

1.AutowiredAnnotationBeanPostProcessor是主要逻辑类&#xff0c;基本逻辑同Autowird 2.PropertySourcesPlaceholderConfigurer中会将StringValueResolver添加到beanFactory 3.外部配置文件properties会加载到ConfigurableEnvironment中&#xff0c;具体逻辑是通过Applicati…

vscode中如何将cmd设置为默认终端

vscode中如何将cmd设置为默认终端&#xff1f;下面本篇文章给大家介绍一下vscode中设置默认终端为cmdPowerShelWSL等的方法&#xff0c;希望对需要的朋友有所协助&#xff01; 一、快捷键&#xff08;CtrlShiftP打开命令面板&#xff0c;输入select选择“SelectDefaultProfil …

mdadm命令详解及实验过程

mdadm命令详解及实验过程 ⼀.概念 mdadm是multiple devices admin的简称&#xff0c;它是Linux下的⼀款标准的软件 RAID 管理⼯具&#xff0c;作者是Neil Brown ⼆.特点 mdadm能够诊断、监控和收集详细的阵列信息 mdadm是⼀个单独集成化的程序⽽不是⼀些分散程序的集合&#…

Jupyter使用技巧-环境篇

不同于其他IDE&#xff0c;有时会出现找不到文件路径&#xff0c;通常是因为当前工作目录&#xff08;working directory&#xff09;不同所导致的。Jupyter Notebook 会在启动时选择一个初始的工作目录&#xff0c;而这个目录可能与你运行 .py 文件时所在的目录不同。 import…