浮点数(小数)在计算机中如何用二进制存储?

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/137182814
出自【进步*于辰的博客】

注:为了阐述更加严谨,本篇文章中将使用一些二进制的相关概念,出自上篇博文。

前言

在解析Float类的源码时,我对MAX_VALUE/MIN_VALUE的值很好奇,它们是怎么来的?于是利用我所知的二进制知识,尝试运算。一开工就发现没辙,因为我压根不知道小数的二进制是怎样表示、又是如何存储的。于是寻得一方案:

启发博文:浮点数(小数)在计算机中如何用二进制存储?(转发)。

这位博主的阐述专业且详细,下面我通过个人理解,尽量简明扼要地为大家阐明这个知识点。

正文

在开始之前,大家先看一张图。
在这里插入图片描述
Float 就是单精度,就是说 Float 变量由32位(4字节)二进制表示。现在大家对这张图有所疑惑,无妨,我要表达的意思是,小数的二进制由三部分组成,与整数完全不同。换言之,给我们一组小数的二进制,我们无法直接看出它的 真值 \color{green}{真值} 真值是多少。因此,需要使用一种纸面上的二进制数表现形式。

如何运算出这种纸面上的二进制数表现形式? \color{grey}{如何运算出这种纸面上的二进制数表现形式?} 如何运算出这种纸面上的二进制数表现形式?
所谓纸面上,就是一目了然,也就是使用整数二进制的表现形式去表现小数。那位博主是这样说的:

二进制转换为十进制的方法就是各个位的数字与位权乘积之和。

什么是“位权”?这张图给了答案。
在这里插入图片描述
就是底数的指数幂

答案很清楚了,可是如何运算浮点数的小数部分的二进制,难道使用如上“求和”的方法?当然可以,不过不太方便。

从另一位博主那儿“取经”得一方法:使用上图示例。整数部分照旧,是1011,将小数部分0.1875进行以下运算:

0.1875 * 2 = 0.37500
0.3750 * 2 = 0.75000
0.7500 * 2 = 1.50001
0.5000 * 2 = 1.00001

0011

结论:

将小数部分乘以2,取结果的整数部分,如此反复,直至结果为0,最后依次得到的整数部分就是小数部分的二进制。

PS:暂不懂其中原理,就挺好用。

补充一点 \color{red}{补充一点} 补充一点:那位博主将100个 float 类型的0.1相加,最终结果不是10.0
在这里插入图片描述
大家便可明了,无论二选一,0.1都是无限小数。无论单双精度,都无法表示完全,必然有所缺失或增加(四舍五入),故是10.000002

成功了一半,可1011.0011只是11.1875在纸面上的二进制数表现形式。

浮点数 ( 小数 ) 在计算机中如何用二进制存储? \color{grey}{浮点数(小数)在计算机中如何用二进制存储?} 浮点数(小数)在计算机中如何用二进制存储?
回到第一张图,小数的二进制由符号、指数、尾数三部分组成,这说明必然有一个公式,将这三部分进行运算,从而得到 真值 \color{green}{真值} 真值

公式是这样的:
在这里插入图片描述
二进制中基数(又称“底数”)是2,自然不必考虑。小数内部构造的三部分正好与图中三个未知变量对应,下面我一一剖析。(以单精度为例)

符号部分占1位,即0/1。(PS:小数没有 补码 \color{brown}{补码} 补码之说)

指数部分(8位)与尾数部分(23位)又是如何表示小数的?

我们来探讨一下,看到 m * ne 这样的公式,给你11.1875这个小数,你能想到哪些等式?

11.1875 = 111.875 * 10-1,m是111.875,n是10,e是 -1
11.1875 = 1.11875 * 101, m是1.11875,n是10,e是 1
......

有问题么?这里是二进制,n 是2,不是10,故等式不能这么写。

可是要满足如下等式,m 是多少?

11.1875 = m * 2-1
11.1875 = m * 21
......

看到这样的等式,大家是否似曾相识?没错,位运算,也就是这样:

11.1875 = m * 2-1 = m >> 1
11.1875 = m * 21 = m << 1
......

明白了么?

可这里有个问题,因为位运算移动的位数e是任意的,故 m 任意,则必然存在一个规范,用于限制e的值。

规范定义:

尾数部分用的是“将小数点前面的值固定为1的正则表达式”。
什么是正则表达式?按照特定的规则来表示数据的形式的表达式。

这样就清楚了,规范就是“将小数点左边第一位固定为1,其他为0”。如此,e就只有一个值。

PS:不过,对于那位博主将规范定义为“正则表达式”这一点,我的个人看法是,意思没错,可用词似乎不恰当,当时我就被误导了。当然,也可能是我的功底不扎实。

规范知道了,可尾数m是多少呢?大家在上文的阅读中有没有注意到一个细节?就是“纸面上的二进制数表现形式”那儿,我最后说了一句:“成功了一半”。成功在哪?又何出此言?

其实,小数在纸面上的二进制数表现形式就是 m * 2e 的结果。以11.1875为例:

11.18751011.0011

规范是“将小数点左边第一位固定为1,其他为0”,就是这样:

11.18751011.0011 = 1.0110011 << 3 = 1.0110011 * 23

这样,难道 m 是1.0110011?当然不是,那位博主已阐明:
在这里插入图片描述

因此,m 是01100110000000000000000。e 是3

对应到小数的内部构造,11.1875的二进制是:

0 00000011 01100110000000000000000

这是正确答案吗?还不是。

运用以上方法,我们来计算一下0.1875的二进制:

0.0011						原始数值
1.1							左移使个位为 1
1.10000000000000000000000	确保小数点后有2310000000000000000000000		仅保留小数点后的部分

得出,m 是10000000000000000000000,e 是-3

因此,0.1875的二进制是0 10000011 10000000000000000000000。(指数e使用的是“原码”,不是“补码”)

这样看来,似乎没有问题,可实际上指数部分还有点“门道”。

那位博主阐述道:

指数部分使用了 “ E X C E S S 系统表现” \color{green}{“EXCESS系统表现”} EXCESS系统表现

什么是“EXCESS系统表现”?那位博主已阐述得很清楚,我就不赘述了。

总结:

  • 11.1875的二进制是0 10000010 01100110000000000000000
  • 0.1875的二进制是0 01111100 10000000000000000000000

PS:

  1. 如果采用双精度,同理,只是二进制位数增加了而已。
  2. 那位博主运用 c++ 代码进行了验证,我把他提供的 code copy test 了一下,同样验证无误,只是目前我暂不知如何使用 java 进行验证,需要大家自行研究了。

本文完结。

上一篇:《二进制相关概念、运算与应用》。

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

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

相关文章

c语言例题,计算字符串长度,递归思想

c语言中&#xff0c;计算字符串长度算是一个比较经典的题了&#xff0c;而今天我们运用两种不同的求解方法来写出不同的程序来实现计算字符串的功能。 主函数 先看到主函数&#xff0c;主函数中设置了一串7个字符的字符串&#xff0c;而后面接下来定义了两个变量len1和len2&am…

【键值皆有序map 线段树 数学 】100240. 最小化曼哈顿距离

本文涉及知识点 键值皆有序map 线段树 数学 LeetCode100240. 最小化曼哈顿距离 给你一个下标从 0 开始的数组 points &#xff0c;它表示二维平面上一些点的整数坐标&#xff0c;其中 points[i] [xi, yi] 。 两点之间的距离定义为它们的曼哈顿距离。 请你恰好移除一个点&am…

【蓝桥杯第十三届省赛B】(部分详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

SOC内部集成网络MAC外设+ PHY网络芯片方案:MII/RMII 接口与 MDIO 接口

一. 简介 本文来了解一下常用的一种网络硬件方案&#xff1a;SOC内部集成网络MAC外设 PHY网络芯片方案。 其中涉及的 MII接口&#xff0c;RMII接口&#xff08;MII接口与RMII接口二选一&#xff09;&#xff0c;MDIO接口&#xff0c;RJ45。 二. MII/RMII 接口&#xff0c;M…

unity学习(74)——服务器Dispose异常

1.返回的1 2 11是怪物初始化&#xff0c;源代码中也没有 2. 3.客户端中的网络连接初始化如下&#xff1a; 4.不是因为超时&#xff0c;设置10s为超时期限后&#xff0c;客户端和服务器有时依然会报错&#xff01; 5.我感觉就是update中发包给弄坏的&#xff01; 6.不在“帧”…

【prometheus】k8s集群部署Grafana安装并接入Promethues数据源

目录 一、概述 1.1 优点 1.2 特点 二、grafana部署 三、grafana接入Promethues数据源 四、grafana可视化展示物理节点指标数据 五、grafana可视化展示k8s组件指标数据 5.1 kube-state-metrics简介 5.2 安装kube-state-metrics组件 一、概述 Grafana是一款用Go语言开发…

CodeTON Round 8 D. Learning to Paint 【DP求前k大】

D. Learning to Paint 题意 有一个 n n n 个格子长度的条带&#xff0c;格子从左到右编号为 1 → n 1 \rarr n 1→n&#xff0c;可以选择若干子段&#xff08;或不选&#xff09;的格子&#xff0c;给定一个二维数组 a a a 每选择一个 [ l i , r i ] [l_i,r_i] [li​,ri​…

5G无线接入网和接口协议

**部分笔记** 4.3无线协议架构 NR无线协议分为两个平面&#xff1a;用户面和控制面。 用户面&#xff08;UP&#xff09;:协议栈及用户数据采用的协议 控制面(Control Plane&#xff0c;CP)协议栈即系统的控制信令传输采用的协议簇。 虚线标注的是信令数据的流向。一个UE在…

[计算机效率] 文件加密工具:Lockdir

3.11 文件加密工具&#xff1a;Lockdir Lockdir是一款安全性高、使用简单、体积极小的便携式文件夹加密器&#xff0c;无需安装&#xff0c;一键加密&#xff0c;一键解密&#xff0c;加密算法高&#xff0c;是优秀的加密工具。其主要特点包括&#xff1a; 加密操作简易&#…

遥感动态监测技术

很多人对动态监测和动态检测两个名词有疑惑。我们可以这样理解&#xff0c;动态监测是一个广义的名词&#xff0c;泛指数据预处理、变化信息发现与提取、变化信息挖掘与应用等&#xff0c;以对整个流程的叙述。动态检测是一个狭义的名词&#xff0c;主要指部分数据预处理、变化…

Python | Leetcode Python题解之第4题寻找两个正序数组的中位数

题目&#xff1a; 题解&#xff1a; class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:def getKthElement(k):"""- 主要思路&#xff1a;要找到第 k (k>1) 小的元素&#xff0c;那么就取 pivot1 nums1[k…

需要给Word文档中的汉字注音,拼音要在汉字的右边 要怎么操作?两种方法一学就会

在Word文档中&#xff0c;为字体添加拼音是一个常见的需求&#xff0c;特别是在处理包含生僻字或需要标注拼音的文本时。下面&#xff0c;我们将详细介绍如何在Word文档中将拼音加到字体的右边。 方法一&#xff1a;使用“汇帮注音大师”给汉字加拼音加到右边 第一步&#xf…

快速排序---算法

1、算法概念 快速排序&#xff1a;通过一趟排序将待排记录分隔成独立的两部分&#xff0c;其中一部分记录的数据均比另一部分的数据小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到震哥哥序列有序。 快速排序的最坏运行情况是O()&#xff0c;比如说顺序数…

整数删除,蓝桥杯训练题

题目描述: 给定一个长度为 N 的整数数列&#xff1a;A1,A2,…,AN。 你要重复以下操作 K 次&#xff1a; 每次选择数列中最小的整数&#xff08;如果最小值不止一个&#xff0c;选择最靠前的&#xff09;&#xff0c;将其删除&#xff0c;并把与它相邻的整数加上被删除的数值。 …

【前端面试3+1】06继承方式及优缺点、缓存策略、url输入到渲染全过程、【二叉树中序遍历】

一、继承有哪些方式&#xff1f;以及优缺点 继承的方式包括原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承和组合式继承。 1.原型链继承&#xff1a; 实现方式&#xff1a;将子类的原型指向父类的实例来实现继承。优点&#xff1a;简单易懂&#xff0c;代码量少。…

linux 一些命令

文章目录 linux 一些命令fdisk 磁盘分区parted 分区文件系统mkfs 格式化文件系统fsck 修复文件系统 mount 挂载swap 交换分区清除linux缓存df du 命令raid 命令基本原理硬raid 和 软raid案例raid 10 故障修复&#xff0c;重启与卸载 lvm逻辑卷技术LVM的使用方式LVM 常见名词解析…

wavedec2函数及使用

在MATLAB中&#xff0c;进行小波分解及其逆运算是处理图像的一种常见方法&#xff0c;尤其适用于图像分析、压缩和去噪等场景。wavedec2函数可以对二维信号&#xff08;例如图像&#xff09;进行多级小波分解&#xff0c;而waverec2函数则用于进行相应的逆运算。以下是如何使用…

【树状数组专题】【蓝桥杯备考训练】:数星星、动态求连续区间和、一个简单的整数问题、一个简单的整数问题2【已更新完成】

目录 1、数星星&#xff08;《信息学奥赛一本通》 & ural 1028&#xff09; 思路&#xff1a; 基本思路&#xff1a; 树状数组经典三函数&#xff1a; 1、lowbit()函数 2、query()函数 3、add()函数 最终代码&#xff1a; 2、动态求连续区间和&#xff08;《信息学奥赛一本…

笔记本三屏异显方案——更新中,是否能够在FPGA上实现,淘宝购物的价格太贵

三屏是&#xff08;笔记本电脑屏幕&#xff0c;两个显示器屏幕&#xff09;&#xff0c;异显是采用屏幕的扩展功能&#xff0c;这样能够左边看视频文章&#xff0c;右边control cv代码。 一、 电脑有一个HDMI口的时候&#xff0c;只需要买一个TypeC&#xff08;雷电接口&#x…

ruoyi-nbcio-plus基于vue3的flowable任务监听器的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…