【计算机组成原理】1、浮点数的二进制表示、科学计数法、IEEE754标准

news2024/9/27 5:46:01

文章目录

  • 什么是浮点数
  • 浮点数表示数字
  • 浮点数的二进制表示
  • 浮点数的「IEEE754标准」二进制表示
    • 背景
    • 特殊约定
    • 示例
  • 浮点数为什么有精度损失
  • 浮点数的范围和精度有多大
  • 参考资料

用定点数表示数字时,会约定小数点的位置固定不变,整数部分和小数部分分别转换为二进制,就是定点数的结果。

但用定点数表示小数时,存在数值范围、精度范围有限的缺点,所以一般用「浮点数」来表示小数。

什么是浮点数

浮点数,是用科学计数法表示的,而这种方式其「小数点的位置是漂浮不定的」,故命名为浮点数。如下例:

25.125 = 0.25125 * 10 ^ 2
25.125 = 2.5125 * 10 ^ 1
25.125 = 25.125 * 10 ^ 0
25.125 = 251.25 * 10 ^ -1
25.125 = 2512.5 * 10 ^ -2
25.125 = 25125.0 * 10 ^ -3
25.125 = 251250 * 10 ^ -4

而同样的规则,二进制数也可以用科学计数法表示,将基数 10 换成 2 即可。

浮点数表示数字

浮点数用科学计数法表示数字的格式如下:

V = ( − 1 ) S ∗ M ∗ R E V = (-1)^S * M * R^E V=(1)SMRE

如果要在计算机中,用浮点数表示一个数字,只需要确认这几个变量即可。其中各变量含义如下:

  • S:符号位,0 表示正数,1 表示负数
  • M:尾数,用小数表示,例如 3.254 ∗ 1 0 − 2 3.254 * 10^{-2} 3.254102 3.254 3.254 3.254 就是尾数
  • R:基数,表示十进制数则 R 就是 10,表示二进制数则 R 就是 2
  • E:指数,用整数表示,例如 3.254 ∗ 1 0 − 2 3.254 * 10^{-2} 3.254102 − 2 -2 2 就是指数

如果要用 32bit 表示一个浮点数,则只要把以上变量,填充到这些 bit 上就可以了:

假如我们定义如下填充这些 bit 的规则,图示如下:

  • 符号位 S 占 1 bit
  • 指数 E 占 10 bit
  • 尾数 M 占 21 bit

在这里插入图片描述

浮点数的二进制表示

按此规则,将十进制数 25.125 转换为浮点数,过程如下图(D 表示十进制,B 表示二进制):

  1. 整数部分:25(D) = 11011(B)
  2. 小数部分:0.125 = 0.001(B)
  3. 用二进制的科学计数法表示:25.125(D) = 11001.001(B) = 1.1001001 * 2^4(B)
    在这里插入图片描述

所以将上述 S、M、R、E 填充到 32 bit 中,则如下图即为「浮点数的二进制表示」:

在这里插入图片描述

浮点数的「IEEE754标准」二进制表示

背景

从上例可知,浮点数的格式会因为定义规则的不同,而导致范围和精度都不同:

  1. 指数位约多,则尾数位越少:则其表示的范围越大,但精度也越差。
  2. 指数位越少,则尾数位越多:则其表示的范围越小,但精度也会变好。

而早期各计算机厂商(如 IBM、微软)都会定义自己的一套浮点数规则,就会导致同一个程序在不同厂商的计算机下做浮点数运算时,必须「先转换」成此厂商规定的浮点数格式,才能计算,则加重了计算成本。

因此业界迫切需要统一的浮点数标准,1985年 IEEE 组织提出了 「IEEE754 浮点数标准」,其统一定义了浮点数的表示形式:

  • 单精度浮点数 float:32 位,符号位 S 占 1 bit,指数 E 占 8 bit,尾数 M 占 23 bit
  • 双精度浮点数 float:64 位,符号位 S 占 1 bit,指数 E 占 11 bit,尾数 M 占 52 bit

特殊约定

为了让其表示范围、精度最大化,还厎指数和尾数做了如下规定:

  1. 因为尾数 M 的第一位总是 1(因为 1 <= M < 2),因此这个 1 可以省略不写,它是个隐藏位,这样单精度 23 位尾数可以表示了 24 位有效数字,双精度 52 位尾数可以表示 53 位有效数字
  2. 因为指数 E 是个「无符号」整数,表示 float 时,一共占 8 bit,所以它的取值范围为 0 ~ 255。但因为指数可以是负的,所以规定在存入 E 时在它原本的值「加上一个中间数 127」,这样 E 的取值范围为 -127 ~ 128。表示 double 时,一共占 11 bit,存入 E 时加上中间数 1023,这样取值范围为 -1023 ~ 1024。

除了规定尾数和指数位,还做了以下规定,如下图:

  • 指数 E 非全 0 且非全 1:规格化数字,按上面的规则正常计算
  • 指数 E 全 0,尾数非 0:非规格化数,尾数隐藏位不再是 1,而是 0(M = 0.xxxxx),这样可以表示 0 和很小的数
  • 指数 E 全 1,尾数全 0:正无穷大/负无穷大(正负取决于 S 符号位)
  • 指数 E 全 1,尾数非 0:NaN(Not a Number)

在这里插入图片描述

示例

有了这个统一的浮点数标准,我们再把 25.125 转换为标准的 float 浮点数:

  1. 整数部分:25(D) = 11001(B)
  2. 小数部分:0.125(D) = 0.001(B)
  3. 用二进制科学计数法表示:25.125(D) = 11001.001(B) = 1.1001001 * 2^4(B)

所以 S = 0,尾数 M = 1.001001 = 001001(去掉1,隐藏位),指数 E = 4 + 127(中间数) = 135(D) = 10000111(B)。填充到 32 bit 中,如下:

在这里插入图片描述

这就是标准 32 位浮点数的结果。

如果用 double 表示,和这个规则类似,指数位 E 用 11 bit 填充,尾数位 M 用 52 bit 填充即可。

浮点数为什么有精度损失

经常听到的浮点数会有精度损失的情况是怎么回事?

如果我们现在想用浮点数表示 0.2,它的结果会是多少呢?

0.2 转换为二进制数的过程为,不断乘以 2,直到不存在小数为止,在这个计算过程中,得到的整数部分从上到下排列就是二进制的结果。

0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0(发生循环)
...

所以 0.2(D) = 0.00110…(B)。

因为十进制的 0.2 无法精确转换成二进制小数,而计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。

浮点数的范围和精度有多大

以单精度浮点数 float 为例,它能表示的最大二进制数为 +1.1.11111…1 * 2^127(小数点后23个1),而二进制 1.11111…1 ≈ 2,所以 float 能表示的最大数为 2^128 = 3.4 * 10^38,即 float 的表示范围为:-3.4 * 10^38 ~ 3.4 * 10 ^38。

它能表示的精度有多小呢?

float 能表示的最小二进制数为 0.0000….1(小数点后22个0,1个1),用十进制数表示就是 1/2^23。

用同样的方法可以算出,double 能表示的最大二进制数为 +1.111…111(小数点后52个1) * 2^1023 ≈ 2^1024 = 1.79 * 10^308,所以 double 能表示范围为:-1.79 * 10^308 ~ +1.79 * 10^308。

double 的最小精度为:0.0000…1(51个0,1个1),用十进制表示就是 1/2^52。

从这里可以看出,虽然浮点数的范围和精度也有限,但其范围和精度都已非常之大,所以在计算机中,对于小数的表示我们通常会使用浮点数来存储。

参考资料

浮点数的二进制表示、IEEE754标准

浮点数的二进制转换示例

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

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

相关文章

中原银行使用 XSKY星辰天合对象一体机解决核心系统备份管理问题

中原银行使用星辰天合 X3000 对象存储一体机在生产中心和灾备中心分别搭建分布式存储集群&#xff0c;通过 S3 协议与 NBU 备份平台对接&#xff0c;提供海量存储服务&#xff0c;实现备份平台架构转型。 近年来&#xff0c;金融机构随着业务规模及数据量的持续增长&#xff0c…

JavaSE19-常见类

文章目录一、Object1.概述2.常用方法二、String1.概述2.对象创建2.1 直接使用字面值2.2 使用构造方法3.常用方法三、包装类1.概述2.创建对象2.1 直接使用字面值2.2 使用构造方法2.3 使用静态方法valueOf3.常用方法4.自动装箱与自动拆箱4.1 自动装箱4.2 自动拆箱4.3 原理四、Str…

各类特殊开关电源问题解决方案

一、提高DCDC芯片电流 使用大功率三极管代替芯片内部开关管提高过流能力 二、BUCK电路实现负电压 将buck的地作为-Vout输出&#xff0c;原输出接地。 注&#xff1a;不要用LM2596跟LM2576 三、FLY-BUCK电路 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20808c03b126…

成功解决xshell7会话窗口只能显示一个的问题

文章目录前言一. 问题复现二. 问题解决方法一方法二三. 拓展3.1 自定义快捷键3.2 将当前shell中的代码内容复制到记事本中3.3 xshell配置密钥登录3.3.1 生成密钥3.3.2 将密钥上传到服务器并设置3.3.3 用xshell密钥登录服务器总结前言 重点强调&#xff1a; 本文是解决xshell的…

Linux系列 使用vi文本编辑器

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.vi文本编辑器 1.使用vi文本编辑器 2.vi编辑器的工作模式 3.命令模式中的…

【LeetCode】剑指 Offer(13)

目录 题目&#xff1a;剑指 Offer 31. 栈的压入、弹出序列 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 31. 栈…

重写toString()方法-课后程序(JAVA基础案例教程-黑马程序员编著-第十二章-课后作业)

【案例12-1】&#xff1a;重写toString()方法 【案例介绍】 1.案例描述 为了方便输出对象&#xff0c;Object类提供了toString()方法。但是该方法的默认值是由类名和哈希码组成的&#xff0c;实用性并不强。通常需要重写该方法以提供更多的对象信息。 本案例要求使用反射重…

3D可视化大屏制作真的那么难?没有好用的软件解决吗?

有多少人印象里的数据可视化大屏还是像这样的二维大屏&#xff1f;这种二维可视化大屏早就不能满足审美日益提高的大众了。 现在用的都是3D可视化大屏&#xff0c;这种结合了3D技术的可视化形式不仅让数据更加的清晰&#xff0c;也增加了美感&#xff0c;这观看体验&#xff…

【数据结构】单链表——增删查改【万字介绍】

目录 一&#xff0c;线性表 1&#xff0c;什么是线性表 2&#xff0c;线性表的结构 二&#xff0c;链表 1&#xff0c;什么是链表 2&#xff0c;链表的分类 3&#xff0c;单链表的特点 三&#xff0c;链表的实现 1&#xff0c;结构的定义 2&#xff0c;创建一个新结点 3&#…

ChatGPT 不是黑魔法,“替代搜索引擎”言之尚早

ChatGPT 火了。整个 LLM 和搜索领域都已经在过去几个月内发生了翻天覆地的变化。ChatGPT 不再是一个玩具&#xff0c;它开始被微软、谷歌集成在搜索以及各个 SaaS 服务中&#xff0c;且取得了令人惊叹的效果。我尝试着使用 ChatGPT 回答过去一个月搜索过的 30 个问题&#xff0…

10个必须知道的JavaScript技巧,让你成为更好的程序员

1.Promise回调地狱Promises 提供了一种优雅的方式来处理 JavaScript 中的异步操作。这也是避免“回调地狱”的解决方案之一。但是我并没有真正理解它的意思&#xff0c;所以我写了这段代码。我做了这些事情&#xff1a;先获取用户的基本信息。按用户信息获取所有文章的简要摘要…

SPI_Master驱动程序框架

SPI_Master驱动程序框架 文章目录SPI_Master驱动程序框架一、SPI传输概述1.1 数据组织方式1.2 SPI控制器数据结构二、 SPI传输函数的两种方法2.1 老方法2.2 新方法致谢参考内核源码: drivers\spi\spi.c 一、SPI传输概述 1.1 数据组织方式 使用SPI传输时&#xff0c;最小的传…

hutool日期工具类相关:获取某月所有周、某周的起止时间或所有日期、计算连续天数

目录前言实现1、获取当月的所有周2、根据指定的第几周&#xff0c;获取这周的开始、结束时间3、获取当前月某一周的所有日期4、多个日期中&#xff0c;计算最大的连续天数5、判断指定日期是否在某个范围内前言 最近做项目&#xff0c;碰到一个比较复杂的日期查询方式&#xff…

内网vCenter部署教程二,最全的了!

一、组网说明 vCenter组网最佳实践 每台服务器需要6个网口,需要三个分布式交换机,每个交换机分配2个物理网卡做冗余,分别做为管理网络、业务网络、高可用网络使用。另vsan网络和vmotion网络可以复用业务网络或管理网络,vcenter HA需要单独用一个网络。 二、创建管理网络…

Ubuntu通过rsync和inotify实现双机热备

Rsync Inotify双机热备 一、备份机操作 备份机&#xff1a;主服务器或主机文件将需要备份的文件同步到此服务器上&#xff0c;即从主服务器上同步过来进行备份。 1.1安装rsync sudo apt-get install rsync1.2修改/etc/dault/rsync文件 sudo vim /etc/default/rsync修改如…

二叉树——修剪二叉搜索树

669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代…

GPT:通用预训练语言模型

论文标题&#xff1a;Improving Language Understanding by Generative Pre-Training论文链接&#xff1a;https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf论文来源&#xff1a;OpenAI一、概述从无标注文本中高效学习的能力对于缓解对监督学习的依赖…

PLUMBER Boosting the Propagation of Vulnerability Fixes in the npm Ecosystem

PLUMBER: Boosting the Propagation of Vulnerability Fixes in the npm Ecosystem 1.背景 npm是JavaScript编程语言中最大的生态系统&#xff0c;截至2022年1月&#xff0c;它拥有超过180万个第三方软件包。2017年11月2日的npm快照进行的调查显示&#xff0c;在610,097个包中…

从16K跳槽到20K,最后算下来年薪却还降了,我笑了····

跳槽时薪资涨了 4000&#xff0c;但年薪总包算下来反而变少了&#xff0c;这是怎么回事&#xff1f; 上周&#xff0c;我星球里一个同学就遇到了这么一个问题&#xff0c;薪资涨了、总包降了&#xff0c;而且谈薪时把自己坑了。 作为一个案例&#xff0c;我觉得对很多人可能会…

【项目设计】高并发内存池 (四)[pagecache实现]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…