您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 第7章DSP定点数和浮点数(重要)
1、安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第11页页共共88页页第第77章章DDSSPP定定点点数数和和浮浮点点数数((重重要要))本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。7.1定点数和浮点数概念7.2IEEE浮点数7.3定点数运算7.4总结77..11定定点点数数和和浮浮点点数数概概念念如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数,整数只是其表现形式)。77..11..11定定点点数数常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。77..11..22浮浮点点数数在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fix。
2、edPointNumber)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如99.00或者00.99可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL中的NUMBER数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如123.45用十进制科学计数法可以表达为1.2345×102,其中1.2345为尾数,10为基数,2为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。提示:尾数有时也称为有效数字(Significand)。尾数实际上。
3、是有效数字的非正式说法。安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第22页页共共88页页同样的数值可以有多种浮点数表达方式,比如上面例子中的123.45可以表达为12.345×101,0.12345×103或者1.2345×102。因为这种多样性,有必要对其加以规范化以达到统一表达的目标。规范的(Normalized)浮点数表达方式具有如下形式:±d.dd...d×βe,(0≤diβ)其中d.dd...d即尾数,β为基数,e为指数。尾数中数字的个数称为精度,在本文中用p来表示。每个数字d介于0和基数之间,包括0。小数点左侧的数字不为0。基于规范表达的浮点数对应的具体值可由下面的表达式计算而得:±(d0+d1β-1+...+dp-1β-(p-1))βe,(0≤diβ)对于十进制的浮点数,即基数β等于10的浮点数而言,上面的表达式非常容易理解,也很直白。计算机内部的数值表达是基于二进制的。从上面的表达式,我们可以知道,二进制数同样可以有小数点,也同。
4、样具有类似于十进制的表达方式。只是此时β等于2,而每个数字d只能在0和1之间取值。比如二进制数1001.101相当于1×23+0×22+0×21+1×20+1×2-1+0×2-2+1×2-3,对应于十进制的9.625。其规范浮点数表达为1.001101×23。77..22IIEEEEEE浮浮点点数数说明:Cortex-M4F中的FPU(浮点单元)就是用的这个IEEE754标准,初学的要认真学习。IEEE二进制浮点数算术标准(IEEE754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormalnumber)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。IEEE754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80比特实做)。只有32位模式有强制要求,其他都是选择性的。大部分编程。
5、语言都有提供IEEE浮点数格式与算术,但有些将其列为非必需的。例如,IEEE754问世之前就有的C语言,现在有包括IEEE算术,但不算作强制要求(C语言的float通常是指IEEE单精确度,而double是指双精确度)。该标准的全称为IEEE二进制浮点数算术标准(ANSI/IEEEStd754-1985),又称IEC60559:1989,微处理器系统的二进制浮点数算术(本来的编号是IEC559:1989)。后来还有“与基数无关的浮点数”的“IEEE854-1987标准”,有规定基数为2跟10的状况。现在最新标准是“IEEE854-2008标准”。在六、七十年代,各家计算机公司的各个型号的计算机,有着千差万别的浮点数表示,却没有一个业界通用的标准。这给数据交换、计算机协同工作造成了极大不便。IEEE的浮点数专业小组于七十年代末期开始酝酿浮点数的标准。在1980年,英特尔公司就推出了单片的8087浮点数协处理器,其浮点数表示法及定义的运算具有足够的合理性、先进性,被IEEE采用作为浮点数的标准,于1985年发布。而在此前,这一标准的内容已在八十年代初期被各计算机公司广泛采用,成了事实上的业。
6、界工业标准。安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第33页页共共88页页在IEEE标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。这样,通过尾数和可以调节的指数(所以称为浮点)就可以表达给定的数值了。具体的格式参见下面的图例:IEEE单精度浮点数符号Sign指数Exponent尾数Mantissa1bit8bit38bitIEEE双精度浮点数符号Sign指数Exponent尾数Mantissa1bit11bit52bit在上面的图例中,第一个域为符号域。其中0表示数值为正数,而1则表示负数。第二个域为指数域。其中单精度数为8位,双精度数为11位。以单精度数为例,8位的指数为可以表达0到255之间的255个指数值。但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指。
7、数域中的值,单精度数的偏差值为127,而双精度数的偏差值为1023。比如,单精度的实际指数值0在指数域中将保存为127;而保存在指数域中的64则表示实际的指数值-63。偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成-127到128之间(包含两端)。我们不久还将看到,实际的指数值-127(保存为全0)以及+128(保存为全1)保留用作特殊值的处理。这样,实际可以表达的有效指数范围就在-127和127之间。在本文中,最小指数和最大指数分别用emin和emax来表达。图例中的第三个域为尾数域,其中单精度数为23位长,双精度数为52位长。除了我们将要讲到的某些特殊值外,IEEE标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为1,因此我们在保存尾数的时候,可以省略小数点前面这个1,从而腾出一个二进制位来保存更多的尾数。这样我们实际上用23位长的尾数域表达了24位的尾数。比如:对于单精度数而言,二进制的1001.101(对应于十进制的9.625)可以表达为1.001101×23,所以实际保存在尾数域中的值为00110100000000000000000,即去掉小数点左侧的。
8、1,并用0在右侧补齐。值得注意的是,对于单精度数,由于我们只有24位的指数(其中一位隐藏),所以可以表达的最大指数为224-1=16,777,215。特别的,16,777,216是偶数,所以我们可以通过将它除以2并相应地调整指数来保存这个数,这样16,777,216同样可以被精确的保存。相反,数值16,777,217则无法被精确的保存。由此,我们可以看到单精度的浮点数可以表达的十进制数值中,真正有效的数字不高于8位。事实上,对相对误差的数值分析结果显示有效的精度大约为7.22位。参考下面的示例:安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第44页页共共88页页truevaluestoredvalue--------------------------------------16,777,2151.6777215E716,777,2161.6777216E716,777,2171.6777216E716,777,2181.6777218E716,7。
9、77,2191.677722E716,777,2201.677722E716,777,2211.677722E716,777,2221.6777222E716,777,2231.6777224E716,777,2241.6777224E716,777,2251.6777224E7--------------------------------------根据标准要求,无法精确保存的值必须向最接近的可保存的值进行舍入。这有点像我们熟悉的十进制的四舍五入,即不足一半则舍,一半以上(包括一半)则进。不过对于二进制浮点数而言,还多一条规矩,就是当需要舍入的值刚好是一半时,不是简单地进,而是在前后两个等距接近的可保存的值中,取其中最后一位有效数字为零者。从上面的示例中可以看出,奇数都被舍入为偶数,且有舍有进。我们可以将这种舍入误差理解为半位的误差。所以,为了避免7.22对很多人造成的困惑,有些文章经常以7.5位来说明单精度浮点数的精度问题。提示:这里采用的浮点数舍入规则有时被称为舍入到偶数(RoundtoEven)。相比简单地逢一半则进的舍入规则,舍入到偶数有助于从某些角度减小计算中产生的舍入误。
10、差累积问题。因此为IEEE标准所采用。77..22..11规规范范化化浮浮点点数数通过前面的介绍,大家应该已经了解的浮点数的基本知识,这些知识对于一个不接触浮点数应用的人应该足够了。简单总结如下:标准的浮点数都符都符合如下的公式:其中bias是固定的数值,这个在前面的已经讲解过。参数的具体范围如下安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第55页页共共88页页77..22..22非非规规范范化化浮浮点点数数我们来考察浮点数的一个特殊情况。选择两个绝对值极小的浮点数,以单精度的二进制浮点数为例,比如1.001×2-125和1.0001×2-125这两个数(分别对应于十进制的2.6448623×10-38和2.4979255×10-38)。显然,他们都是普通的浮点数(指数为-125,大于允许的最小值-126;尾数更没问题),按照IEEE754可以分别保存为00000001000100000000000000000000(0x1100000)和00。
本文标题:第7章DSP定点数和浮点数(重要)
链接地址:https://www.777doc.com/doc-5071845 .html