额...啥叫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.
版权声明:本文为博主原创文章,未经博主允许不得转载。