深入理解计算机系统(2.7)------二进制小数和IEEE浮点标准
整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题。但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生了。
在 20世纪80年代以前,每个计算机厂商都设计了自己表示浮点数的规则,以及对浮点数执行运算的细节,这对于应用程序在不同机器上的移植造成了巨大的困难。而在这之后,也就是 1985年左右,IEEE 标准产生了,这是一个仔细制定的表示浮点数及其运算的标准,现在的计算机浮点数也都是采用这个标准。
浮点数不仅仅是为了让数值的表示更加精确,也是为了表示一些整数无法达到的数字,比如一些接近于0的数字,或者一些非常大的数值。因此浮点数对于计算机的意义是非常大的。
1、二进制小数
前面这篇博客 进制间的转换 我们已经讲过了各个进制数的表示。现在我们复习一下:
进位计数制的要素:
①、数码:用来表示进制数的元素。比如二进制数的数码为:0,1。十进制数的数码为:0,1,2,3,4,5,6,7,8,9。十六进制数的数码为:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
②、基数:数码的个数。比如二进制数的基数为2。十进制数的基数为10。十六进制数的基数为 16.
③、位权:数制中每一固定位置对应的单位值称为位权。例如十进制第2位的位权为101即10,第3位的位权为102即100;而二进制第1位的位权为20即1,第3位的位权为4,对于 N进制数,整数部分第 i位的位权为N(i-1),而小数部分第j位的位权为N-j。
那么我们可以说:每个数码所表示的数值=该数码值 * 所处位置的位权。
比如十进制数:(123.45)10=1×102+2×101+3×100+4×10-1+5×10-2
二进制数:(1010)2 =l× 23+0 × 22+l× 21+0 × 20=(10)10
十六进制数:(BAD)16 =11× 162+10×161+13×160=(2989)10
二进制小数(10010.1110)2 = 1 * 24 + 0 * 23 + 0 * 22 + 1 * 21 + 0 * 20 + 1 * 2-1 + 1 * 2-2 + 1 * 2-3 + 0 * 2-4 = 16 + 2 + 1/2 + 1/4 + 1/8
总结来说
十进制表示公式:
对于一个形式为bm....b0.b-1....b-n的二进制小数b来说,二进制表示公式:
从上面的二进制公式我们可以看出,小数点向左移动一位,则相当于 (∑ 2i * bi)/2。因为每一位的位权都*2-1;反过来,小数点向右移动一位,则相当于该数乘以2。
注意:二进制小数不像整数一样,只要位数足够,它就可以表示所有整数。假设我们仅考虑有限长度的编码,那么二进制小数无法精确的表示任意小数,比如十进制小数0.2,我们并不能将其准确的表示为一个二进制数,只能增加二进制长度提高表示的精度。
2、IEEE 浮点表示
IEEE,电气和电子工程师协会( 全称是Institute of Electrical and Electronics Engineers)是一个国际性的电子技术与信息科学工程师的协会,是目前全球最大的非营利性专业技术学会,IEEE 754 标准是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号。
IEEE 浮点标准表示: V = (-1)s * M * 2E 。
①、s 是符号位,为0时表示正,为1时表示负。
②、M为尾数,是一个二进制小数,它的范围是0至1-ε,或者1至2-ε(ε的值一般是2-k次方,其中设k > 0)
③、E为阶码,可正可负,作用是给尾数加权。
我们将浮点数的位划分为三个阶段,分别对这些值进行编码。
一、一个单独的符号位 s 直接编码符号 s
二、k 位的阶码字段 exp =ek-1ek-2...e1e0 编码阶码E
三、n 位小数字段 frac = fn-1fn-2...f1f0 编码尾数 M,但是编码出来的值也依赖于阶码字段的值是否等于0.
一般来说,现在的编译器都支持两种浮点格式,一种是单精度,一种是双精度。单双精度分别对应于编程语言当中的float和double类型。其中float是单精度的,采用32位二进制表示,其中1位符号位,8位阶码以及23位尾数。double是双精度的,采用64位二进制表示,其中1位符号位,11位阶码以及52位尾数。如下图表示:
如果给定了位 s 的表示,根据 exp 的值,被编码的值可以分为三种不同的情况(最后一种情况有两个变种)。下图是单精度的情况:
下面我们分别讲解这三种情况(规格化、非规格化、特殊值)
3、规格化
阶码E 的位模式exp既不全为0(数值0),也不全为1(单精度8位1,数值为255,双精度11位,数值为2047)。
这种情况下,阶码字段被解释为以偏置形式表示的有符号整数。”偏置”的含义就是在原有的值的基础上加上一个偏移量,对于阶码位数为k的情况来说,偏移量Bias = 2k-1-1。假设e是阶码的无符号数值,那么真实的阶码E = e - Bias。
单精度阶码位数为8,则Bias = 127。由于8位阶码下的规格化的浮点数的阶码范围是1至254,因此真实阶码的范围则为-126至127。
对于小数字段 frac = fn-1fn-2...f1f0 它的值 0<= f < 1。那么我们可以表示为0. fn-1fn-2...f1f0,也就是二进制小数点在最高有效位的左边。当计算浮点数数值的时候,会在尾数值的基础上加1,也就是真实的尾数M = 1 + f。因此我们可以把 M 看成一个二进制表达式为 1.fn-1fn-2...f1f0的数字。相当于我们省掉了1位二进制,形成了浮点数表示的约定,默认尾数的值还有一个最高位的1。
4、非规格化的值
当阶码域为全 0 的时候,所表示的数就是非规格化形式。
按照上面规格化的阶码求值方式来说,非规格化的阶码值应该固定在-Bias这个值上面。不过这里有一个小技巧,我们设定阶码的值E = 1 - Bias。这样做是为了能够平滑的从非规格化的浮点数过渡到规格化的浮点数,有关这一点后面我们再详细看。
对于尾数的解释,非规格化的方式与规格化不同,它不会对尾数进行加1的处理,也就是说,真实的尾数M = f。这是为了能够表示0这个数值,否则的话尾数总是大于1,那么无论如何都将得不到0这个数值。
非规格化的浮点数除了可以表示0以外,它还有一个作用,就是可以表示接近于0的数值。另外,在浮点数当中,0的表示有两种,一种是位表示全部为0,则为+0.0。还有一种则是符号位为1,其余全为0,此时为-0.0。
5、特殊值
特殊值是指阶码全为 1 的时候出现的。
在阶码全为1时,如果尾数位全为0,则表示无穷大。符号位为0则表示正无穷大,相反则表示负无穷大。倘若尾数位不全为0时,此时则表示NaN,表示不是一个数字。一些运算的结果不能是实数或者无穷,就会返回NaN值,比如正无穷减正无穷,-1的根号值。在某些应用中表示未初始化的值,也很有用处。这一点在Javascript当中有一个函数isNaN()与这个NaN的含义有点类似,它的作用是用来判断一个参数或者表达式是否是一个数字。
6、数值范围
注意:由于浮点数在正负的区间内是一一对应的,因此我们将忽略符号位对取值范围的影响,我们只讨论符号位为0的情况。
非规格化
①、最小的正非规格化值的位表示,是由最低有效位为 1 而其他所有位为 0 构成。它具有小数(尾数)值 M=f=2-n 和阶码值 E= -2k-1 +2。因此它的数字值是 V= 2-n * 22 - 2k-1 = 2-n+2 - 2k-1。
②、最大的非规格化值,全为0的阶码字段和全为1的小数字段组成。此时的小数(尾数)值 M=f=1-2-n,阶码 E= -2k-1 +2,因此此时的值为 (1 - 2-n) * 22 - 2k-1。
规格化
①、最小的正规格化值,阶码字段的最低有效位为1,其它位为0,。它的尾数值 M = 1。阶码值 E= -2k-1 +2。因此数值 V = 22 - 2k-1
②、最大的规格化值,符号位为0,阶码最低有效位等于0,其它位等于 1,尾数为n个1。它的小数值 f=1-2-n,尾数 M= 2 - 2-n,此时的值为(2 - 2-n) * 2-1 + 2k-1,也可以化简一下为(1 - 2-n-1) * 22k-1。
下面我们看一下非负浮点数单双精度取值范围:
7、总结
本篇博客介绍的 IEEE 浮点标准算是难度系数很高的一节了,需要花很多时间去理解。下篇博客浮点数据类型的舍入以及运算。
深入理解计算机系统(2.7)------二进制小数和IEEE浮点标准的更多相关文章
- 二进制小数和IEEE浮点标准
二进制小数 首先复习进位计数制的要素: 数码:用来表示进制数的元素.比如 二进制数的数码为:0,1 十进制数的数码为:0,1,2,3,4,5,6,7,8,9 十六进制数的数码为:0,1,2,3,4,5 ...
- 深入理解计算机系统(2.7)---二进制浮点数,IEEE标准(重要)
2.6我们进行了二进制整数运算的最后一役,本次LZ将和各位一起进入浮点数的世界,这里没有无符号,没有补码,但是有各种各样的惊奇.倘若你真正的进入了浮点数的世界,一定会发现它原来是这么有意思,而不是像之 ...
- 《深入理解计算机系统》【PDF】下载
<深入理解计算机系统>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382303 内容提要 本书主要介绍了计算机系统的基本概念,包 ...
- 深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)
前言 上一章我们简单介绍了IEEE浮点标准,本次我们主要讲解一下浮点运算舍入的问题,以及简单的介绍浮点数的运算. 之前我们已经提到过,有很多小数是二进制浮点数无法准确表示的,因此就难免会遇到舍入的问题 ...
- 《深入理解计算机系统》实验一 —Data Lab
本文是CSAPP第二章的配套实验,通过使用有限的运算符来实现正数,负数,浮点数的位级表示.通过完成这13个函数,可以使我们更好的理解计算机中数据的编码方式. 准备工作 首先去官网Lab Assig ...
- 《深入理解计算机系统V2》学习指导
<深入理解计算机系统V2>学习指导 目录 图书简况 学习指导 第一章 计算机系统漫游 第二章 信息的表示和处理 第三章 程序的机器级表示 第四章 处理器体系结构 第五章 优化程序性能 第六 ...
- 深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构
引言 各位猿友们好,计算机系统系列很久没更新了,实在是抱歉之极.新的一年,为了给计算机系统系列添加一些新的元素,LZ将其更改为书的原名<深入理解计算机系统>.这本书非常厚,而且难度较高,L ...
- 深入理解计算机系统(1.2)---hello world的程序是如何运行的
在写本章的内容之前,LZ先做个小广告.其实也不算是什么广告,就是LZ为了和各位猿友交流方便,另外也确实有个别猿友留言或者在博客里发短消息给LZ要联系方式.因此LZ斗胆建立了一个有关<深入理解计算 ...
- 《深入理解计算机系统》 Chapter 7 读书笔记
<深入理解计算机系统>Chapter 7 读书笔记 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(货被拷贝)到存储器并执行. 链接的时机 编译时,也就是 ...
随机推荐
- Intel VT-X
VT-x是intel运用Virtualization虚拟化技术中的一个指令集,是CPU的硬件虚拟化技术,VT可以同时提升虚拟化效率和虚拟机的安全性,在x86平台上的VT技术,一般称之为VT-x,而在I ...
- System.ComponentModel.DataAnnotations 冲突
项目从原来的.NET Framework4.0 升级到 .NET Framework4.5 编译报错. 查找原因是: Entity Framework 与 .net4.5 的 System.Compo ...
- GUI与UI的区别
GUI 图形用户界面(**Graphical User Interface**,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. 与早期计算机使用的命令行界面相比,图形界面对 ...
- summernote使用心得
今日因项目需要所以使用了很有名气的富文本编辑器summernote,分享使用方法如下!填了一点坑,提供给需要的朋友借鉴! 直接转入我的前端网 地址: http://www.qdfuns.com/not ...
- javascript基础进阶——执行环境及作用域链
概念 执行环境 执行环境定义了变量或函数有权访问的其他函数,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象. 变量对象 环境中定义的所有变量和函数都保存在这个对象中. 全局执行环境 全局 ...
- log4j日志框架学习
初识Log4j: log4j有三个部分: 1.loggers 负责捕获日志信息. 2.appenders 负责输出信息到不同的目的地 ...
- http长连接与短连接
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp23 http长连接与短连接 一.长连接与短连接: 长连接:client方与 ...
- 裸机LCD驱动配置
横屏4.3寸LCD为480*272(行:480个像素点 列:272个行) 1.1 LCD原理图 : Pin1:Von 电源正(这里由硬件自动控制) Pin2:VM/VDEN 数据使能 ...
- 关于小程序http请求的问题
解决wx.request 发起的是 HTTPS 请求的问题 对于wx.request,大家可以理解为是微信小程序版的ajax,基于安全性考虑他的url地址必须是以https开头的,但对于一个开发者来说 ...
- javascript中=,==,与===的区别;以及特殊值NaN的讲解
1.在js中"="是作为赋值.var a; a=3:给a赋值为3. 2."=="称作相等,"==="被称作严格相等.当使用"== ...