二进制浮点数,IEEE标准

额...啥叫IEEE标准?别着急啊,往后看,这一次我和大家一起学习一下浮点数,这里没有无符号,没有补码,俗话说得好,上帝给你关了一扇门,肯定给你打开一扇窗,没有那种东西饿,肯定有别的.如果你真正进入了浮点数的世界,离着你称霸武林不远了!

写在前面

整数运算虽然能解决计算机当中有关信息的一部分分存储,运算等功能,但却仍然是不够的.否则结社我们要做一个超市的库存管理系统,那么所有的商品的价格只能是整数,还有就是银行的利息也只能是整数!!是不是想想就开心!!哈哈哈,屌丝!

so,有时我们需要更精确的数值表示,由其是银行的那帮家伙更想这样,这就需要浮点数出场了.对于浮点数的表示以及运算规则,在以前是各个计算机制造商各自有一套自己的标准,这就给程序的可移植性造成了很大的困扰.

有需就有求,有买就有卖,最终再1985年的一个冬天,浮点数标准IEEE754诞生了(明白IEEE是个什么玩意了吧?).他就是上帝,就是神,就是god,神统一了人的长相,性别等.IEEE754统一了浮点数的标准.

浮点数不仅仅是为了让树枝的表示更加精确,也是为了表示一些整数无法达到的数字,比如一些接近0的数字,或者一些非常大的数值.因此浮点数对于计算机的意义重大.

二进制小数

我们先来看看二进制是如何表现小数的,这有助于我们理解浮点数的表示.如果是一个十进制小数,当心大家肯定会很明白,对于12345.6789来说,他的值是由下面这个式子得到的:

12345.6789=1*(10的4次方)+2*(10的3次方)+3*(10的2次方)+4*(10的1次方)+5*(10的0次方)+6*(10的-1次方)+7*(10的-2次方)+8*(10的-3次方)+9*(10的-4次方)

这对我们来说应该是个常识,写完这个小数我就后悔了,我咋这么傻吊啊,我写个1.2多好!

对于二进制小数来说也是类似的,如我们有一个二进制小数10010.1110,他的值是由以下式子得到的:

10010.1110=1*(2的4次方)+0*(2的3次方)+0*(2的2次方)+1*(2的1次方)+0*(2的0次方)+1*(2的-1次方)+1**(2的-2次方)+1*(2的3次方)+0*(2的-4次方)=16+2+(1/2)+(1/4)+(1/8)=18.875

从这个角度看,二进制小数其实和十进制小数是一样的计算方式,只是这里是2的整数次幂而已,八进制小数呢?十六进制小数呢?你也会了,这就是原理,这就是思想

其实树上有个二进制小数的公式,本屌看不懂,所以不给大家说了.

这里需要提醒一下,二进制小数不想整数一样,只要位数足够,二进制可以表示所有整数.二进制小数无法精确地表示任意的小数,比如简单的,十进制里面的0.3,二进制是无法精确表示.

IEEE标准

IEEE标准采用类似于科学技术法的方式表示浮点小数,即我们将每一个浮点数表示为:V=(-1的s次方)*M*(2的E次方).

这其中s为符号位()只要不傻都能看出来,为1时为负数.M为尾数,是一个二进制小数,它有一定的范围:0至1-ε,或者1至2-ε(ε的值一般是2-k次方,其中设k > 0)。E为阶码,是一个二进制整数,可正可负,为了给尾数加权.

浮点格式分为两种,一种是单精度,一种是双精度.单双精度分别对应于编程语言中的float和double类型.其中float是单精度的,采用32位二进制表示,其中1位符号位,8位阶码以及23位尾数.都办了是双精度的,采用64位二进制表示,其中1位符号位,11位阶码,52位尾数.

从上面的位数就能看出,双精度浮点数所表示的范围将远远大于单精度浮点数.针对阶码E的值,浮点数的值可以分为三种不同的情况,分识别规格化的,非规格化的以及特殊值,这三种情况就是浮点数的奥义所在了!

先给出对于单精度的三种情况的图示描述:分别是1,2,3,其中3也就是特殊值又分了两种情况3a和3b.不懂没关系,我也不懂,一起来看(其实后面我想说流星雨...).

规格化的

规格化的浮点数是上述的第一种情况,对于单精度来说,也就是阶码位不为0且不为255的这种情况.

在此范围内的浮点数,阶码会被转换成一个”偏置”后的有符号数.”偏置”的含义就是在原有的值的基础上加上一个偏移量(前面说过,还用过),对于阶码位数为k的情况来说,偏移量Bias=2的k-1次方-1.假设e是阶码的无符号数值,那么真实的阶码E=e-Bias.举个例子,假设阶码位数为8,则Bias=127.由于8位阶码下的规格化的浮点数的阶码范围是1到254,因此真实阶码的范围是-126到127.

对于尾数的解释,则是一个小于1的小数或者0.也就是假设尾数位表示为F[n-1]...F[0],则F的值为0.F[n-1]...F[0].这只是位数的值,当计算浮点数熟知的时候,会在尾数值的基础上加1,也就是真实的尾数M=1+F.相当于我们省掉了1位二进制,形成了读点书表示的约定,默认尾数的值还有一个最高位的1.

非规格化的

非规格化的浮点数对应于图中的第二种情况,也就是阶码全为0的时候.

按照上面规格化的阶码求值方式来说,非规格化的家吗值应该固定在-Bias这个值上面.不过这里有一个小的技巧,我们设定阶码的值E=1-Bias.这样做是为了能够平滑的从非规格化的浮点数过渡到规格化的浮点数.

对于尾数的解释,非规格化的方式与规格化的不同,他不会对位数进行加1的处理,也就是说,真实的尾数M=F.这是为了能够表示0这个值,否则的话尾数总是大于1,那么无论如何都将得不到0这个数值.

非规格化的浮点数除了可以表示0以外,还有另外一个作用,就是可以表示接近0的数值.另另外,在浮点数当中,0的表示有两种,一种是位表示全部为0,则为+0.0.还有一种则是符号位为1,其余全为0,此时为-0.0.

特殊值

特殊值对应于途中3a和3b这两种情况,也就是阶码全为1的时候.

在阶码全为1时,如果尾数全为0,则表示无穷大.符号位为0表示正无穷大,符号位为1表示负无穷大.倘若尾数位不全为0时,此时则表示NaN,表示不是一个数字.这一点在JS当中有一个相关的函数与这个NaN的含义有点类似,他的作用是用来判断一个参数是否是一个数字(想学习JS的朋友,欢迎关注本屌的博客,每天一更哦).

取值范围

下面我们来讨论一下上面三种浮点数的取值范围,我们假设一个浮点数有1位符号位s,k个阶码位以及n个尾数位.下面我们一起探讨这样一个浮点数在各个情况下的一些取值范围.

在谈论取值范围的时候,首先说明一点,第一点是由于特殊值的特殊性,他没有取值范围这一概念,因此不再我们的谈论范围之内.

第二点,由于浮点数在正负区间内是一一对应的,因此我们将忽略符号位对取值范围的影响,我们只讨论符号位为0的情况.

非规格化的取值范围

对于非规格化的浮点数来说,由于阶码固定为k个0,因此真实阶码都为E=1-(2的k-1次方-1)=2-2的k-1次方.那么我们可以得到几个重要的取值.

1.当尾数为n个0时,此时的值为+0.0

2.当尾数为最低位为1,其余全为0时,此时的值为最小的非0值.他此时的尾数M=F=2的-n次方,因此此时的值为(2的-n次方)*(2的2-2的k-1次方)=2的-n+2-2的k-1次方次方.

3.当尾数为n个1时,此时的值为最大的非规格化的值.他此时的尾数M=F=1-2的-n次方,因此此时的值为(1-2的-n次方)*2的2-2的k-1次方次方.

规格化的取值范围

对与规格化的浮点数来说,同样有三个比较重要的取值

1.当阶码为最低位为1,其余全为0,尾数位n个0时,此时的值为最小的规格化的值.它此时的阶码恰好与非规格化的阶码相同,都为E=2-2的k-1次方.而它的尾数值则很好计算,由于位数全部为0,则M=1+F=1.因此此时的值为2的2-2的k-1次方次方.

这里特别注意的是,对于最小的规格化的值来说,它的阶码位刚好与非规格化的阶码位相等,这正是因为我们将非规格化的阶码位取为1-Bias而不是-Bias的功劳.由于而这的阶码相同,而而这的尾数刚好相差2的-n次方(2的-n次方刚好是n位尾数时所能表示的最小精度),,这正好完成了非规格化的值到规格化的值的平滑过渡.同时能看出,最小的规格化的值刚好比最大的非规格化的值大一点.

2.当阶码位最高位为0,其余全为1,尾数为n个0是,此时的值为1.因此在偏置之后,阶码E=0.而尾数M=1+F=1.

3.当阶码位最低位为0,其余全为n个1时,此时的值为最大的规格化的值.此时的阶码E=2的k-1次方-1,尾数M=2-2的-n次方.因此此时的值为(1-2的-n-1次方)*2的2的k-1次方次方.

单双精度的取值范围

以下这个图给出了单双精度中上述六种值的表示方式以及它们的值,我们也可以根据上面的公式自己算出来.本屌是个数学白痴,就不给你们算了.

能够看出来,这里能够表示的值范围是相当大的,这对于一些需要大树枝的科学研究程序或者一些应用程序来说,都是很重要的.

一个有意思的练习

题目:对于一种具有n位小数的浮点数格式,给出不能准确描述的最小正整数的公式(因为想要准确表示它可能需要n+1位小数).假设阶码字段长度k足够大,可以表示的阶码范围不会限制这个问题.

分析:首先可以排除非规格化里的数值范围,因为那些值全部都小于1.再考虑规格化的数值范围里,倘若需要n+1位小数表示,并且是最小的小数的话,则应该是有n个0和最低位的1个1组成.也就是此时的尾数M=1+F=1+2的-n-1次方,此时我们使用解码抵消掉小数位,则取阶码为2的n+1次方,因此组后的值为2的n+1次方+1.

举个例子,考虑最简单的,比如当n为1时则根据上面的式子可以算出这个值为5.此时我们可以将尾数的所有值都列出来,分别是0,1/2,1,3/2.可以看出无论阶码取多少,都不能表示5,6,7,9等这些数字,=(任何一个大于等于5又不是2的整数次幂的值都不能表示),而像1,2,3,4这些都是可以表示的,因此最小的不能准确描述的值就是5.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 06:03:41

二进制浮点数,IEEE标准的相关文章

IEEE二进制浮点数算术标准学习

看到有网上有个项目是要求将浮点数用二进制表示出来,需要用IEEE754标准,查了查维基和深入理解计算机系统,重新学习了一遍浮点数在计算机中的表示和内存中的存储, 先简单的做个笔记,后面需要更深入的理解. IEEE754定义了四种表示浮点数的方式:单精度(32bit),双精度(64bit),延伸单精度(43bit以上),延伸双精度(79bit以上),后两者很少使用,这里讲的是前面两种. 用二进制来表示浮点数分三个部分,以下都已32bit的单精度为例,双精度类似可以推算出来: 三部分为:符号位(si

IEEE754二进制浮点数算术标准

对于32位浮点数 sign: 符号,1位 exponent: 指数,8位,偏码 fraction: 分数,23位,原码 特殊值   指数域的编码值 = 指数的实际值 + 127 这样按照字典序的顺序就可以比较两个指数域的编码值的大小,在比较两个浮点数大小时比使用原码方便 规约形式 “规约”是指用唯一确定的浮点形式去表示一个值. 即要求fraction部分最高有效位为1,且指数域的编码值不为0 由于这种表示下的尾数有一位隐含的二进制有效数字(因为最高位总是1,所以按照规约数解析时,自动在最前面添加

【转】单双精度浮点数的IEEE标准格式

原文网址:http://blog.chinaunix.net/uid-24118190-id-75212.html 单双精度浮点数的IEEE标准格式 关键字:浮点数 IEEE标准 大多数高级语言按照IEEE-754标准来规定浮点数的存储格式.IEEE-754规定 单精度浮点数用4字节存储,双精度浮点数用8字节存储,表示为三部分:符号位.阶和尾数. S+E+MS 符号位,尾数的符号位:E 阶,即指数:M 尾数,即有效小数位数: 单精度格式符号位 1位, bit31阶     8位,bit30~23

深入理解计算机系统(2.7)---二进制浮点数,IEEE标准(重要)

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer11.html 2.6我们进行了二进制整数运算的最后一役,本次LZ将和各位一起进入浮点数的世界,这里没有无符号,没有补码,但是有各种各样的惊奇.倘若你真正的进入了浮点数的世界,一定会发现它原来是这么有意思,而不是像之前一样,觉得了解浮点数的内容没什么用,只要会简单的使用就行了.当然,这其中也可能有部分猿友是觉得这部分内容太难,而对它失去了学习的兴趣. 就像之前的LZ一样,曾经对IEEE标准望而

IEEE 754浮点数表示标准

二进制数的科学计数法 C++中使用的浮点数包括采用的是IEEE标准下的浮点数表示方法.我们知道在数学中可以将任何十进制的数写成以10为底的科学计数法的形式,如下 其中显而易见,因为如果a比10大或者比1小都能够再次写成10的指数的形式,如 然而要想在二进制的世界中将数字写成以10为底的科学计数法的形式,着实有点麻烦,因为你首先需要将二进制的数先化成10进制的表示方法,然后才能写成科学计数法的形式.但是如果我们稍微变通一下科学计数法的标记方法,问题就变得特别的简单了.之所以数学上使用的科学计数法选

IEEE 二进制浮点数的表示

朋友在谈一个物流相关的项目,是以前项目的一个延续,涉及到后台的扩展,手机端的App,外加两个App的对接的蓝牙打印机.这个项目前后说了一个多月了吧,最近才草拟了协议.项目本来不复杂,但是客户却如此的拖延.我觉得客户做事好慢,而朋友觉得是自己的就是自己的,不是自己的急也没有用.不断的打电话询问客户,可能最后还被压价,反而更没办法做了.他其实比我还急,但是人家的心态好.的确凡事急不得. 浮点数 在 C 语言中,有两种存储浮点数的方式,分别是 float 和 double ,当然了还有long dou

Question20180128 十进制转换成二进制浮点数

如何将十进制的浮点数 转换二进制的浮点数,分为两部分: 1. 先将整数部分转换为二进制, 2. 将小数部分转换为二进制, 然后将整数部分与小数部分相加. 以 20.5 转换为例,20转换后变为10100:0.5  要转换二进制,需要乘2, 乘完之后 取整数部分,然后用乘的结果减去整数部分, 然后接着乘2, 直至最后没有小数或者小数出现循环,  即乘完.如果等于0, 就取前面不为0的部分. 0.5 * 2  = 1.0 (取1) 0 * 2 = 0   (0) 所以,  转换后 0.5 = 0.1

MATLAB制作符合IEEE标准的图插入Latex

1.MATLAB最好保存为eps格式,虽然IEEE也支持png等其他格式,但是MATLAB在保存为png格式时,很容易在后期插图时,出现分辨率不足等问题. 2. MATLAB在save as图片的时候,会将图片的留白也保存下来,当把这张图片在latex中插入时,会占据很大的空白,导致主图显的很小.可以通过下述方式来去除留白: 首先  imshow(uint8(data),'border','tight','initialmagnification','fit'); 这是显示图片图片的意思,uin

IEEE 754 浮点数在计算机中的表示方法

IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用.这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”:它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式). IEEE 754规定了四种表示浮点数值的方式:单精确度(32位).双精确度(64位).延伸单精确度(43比特以上,很少使