实数的表示主要有定点法和浮点法(科学计数法)两种。
1、定点数表示法(fixed-point)
所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数,分别入下图1和图2所示。
图1、定点纯小数
图2、定点纯整数
很明显,这种定点数的方案无论将小数点约定在什么位置,都会导致其计数范围比较狭窄,无法满足实际生活当中小数变化范围大的特点。所以定点数方案往往只能应用于特定的场合,而在计算机这种通用性很强的场景下则不适用。
2、浮点数表示法(floating-point)
在生活当中,我们可以通过科学计数法来方便地表示很大或很小的数字,浮点数表示法也是采用了类似的思路。
任意一个二进制数实数N,总可以写成N=2E×M的形式。式中M称为数N的尾数(mantissa或fraction),通常是一个纯小数;E为数N的阶码(exponent),是一个纯整数。如果再考虑到阶和尾数的符号问题,则保存这样的一个实数只需要保存阶符、阶码、尾符和尾数四个部分,如下图所示。
图3、浮点数表示法
在上图当中,除了两个符号位只需要1个二进制位之外,阶和尾数的长度其实是不确定的,而且这四个部分的先后顺序也都可以不固定。为了规范实数的表达,不同的组织(如微软、IEEE等)曾经先后制订了若干的规定,但现在国际上已经统一采用IEEE标准了。
二、IEEE标准IEEE标准是IEEE二进位浮点数算术标准(IEEEStandardforFloating-PointArithmetic)的标准编号,等同于国际标准ISO/IEC/IEEE。(引自百度百科)
图4、IEEE标准
上图我们可以看到,IEEE标准中明确规定了从高位到低位的顺序为尾符(1位)、阶码(e位)和尾数(f位),但没有保留阶符的位置。在实际编程中,实数有32位和64位两种比较常见的选择,下面就以32位的短实数来详细解释。
在32位的实数当中,标准规定e的值为8,f的值为23。该实数的值可以用公式N=(-1)S*(1.F)*2(E-)表示。其中S为符号位,F是23位纯小数,E是8位无符号整数。
1)S=0,N为正数;S=1,N为负数;
2)E的范围为0至,因此减去之后,可以表示2-~2(约等于10-38~),因此不需要专门存放阶符。E的值如果是,用来表示特殊的数值。
例:将82.25转换成32位短浮点数格式。1)先将(82.25)10转换成二进制数(82.25)10=(.01)22)规格化二进制数(.01)2=1.×)计算移码表示的阶码=偏置值+阶码真值阶码:(+6)10=()10=()2符号位:0尾数补齐23位=0000短浮点数代码为:0;;0000表示为十六进制代码为:42AH
在另外一种64位的实数标准当中,在32位的实数当中,标准规定e的值为11,f的值为52。该实数的值可以用公式N=(-1)S*(1.F)*2(E-)表示。其中S为符号位,F是52位纯小数,E是11位无符号整数。和短实数一样,可以推导出64位小数的计量范围大约等于10-~10。
三、IEEE标准中的特殊值(以短浮点为例)
1、从前面的公式我们可以发现,0是无法从公式当中直接实现的。因为IEEE标准特别规定,只要实数的尾数和阶码全部为0,则该数即为0。如果考虑符号位的问题,实际上有正0和负0两种0的存在。
0的浮点十六进制代码为:H-0的浮点十六进制代码为:H
2、如果浮点数的阶码是,而尾数是0,则该数表示无穷大(infinite,简称inf)。另外在程序当中将0作为除数,就会得到无穷大的结果。
正无穷(inf)的浮点十六进制代码为:7FH负无穷(-inf)的浮点十六进制代码为:FFH
3、如果浮点数的阶码是,而尾数不为0,则该数为NAN(NotANumber)。另外对负数求根号或者对数、对超出1的值求反正弦等,就会得到nan的结果。
nan的浮点十六进制代码为:FFCH(C++当中)
四、总结与思考
1、浮点数的表达已经相当复杂,而对其运算的讨论更超出了本课程的范围,感兴趣的同学可自行上网查询。
2、对于生活中的大部分运算,32位和64位的浮点数都足够可以满足,不过在实际编程中往往默认采用64位的浮点数格式。
3、在第3节当中我们给出了几个特殊数值在32位下的编码,那么如果是64位的情况呢?请大家尝试写出。
治白癜风哪个医院最好北京正规白癜风医院