定点与浮点 一、定点数与浮点数的相关概念 简单的说,如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”。 (1)定点数 常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。例如,假定用两个字节存放一个定点数,则以定点方式表示的十进制整数195为: 这里,(-0.6876)10=(-0.10110000000001101…)2,转换为无限循环小数,存储时多余的位被截断。如果知道一个定点数的小数点位置约定和占用存储空间大小,那么很容易确定其表示数的范围。 (2)浮点数 在数学中,表示一个浮点数需要三要素:尾数(Mantissa)、指数(Exponent,又称为阶码)和基数(Base)。任意一个浮点数N可以表示成下列形式:N = M × BE, M和E决定了浮点数的精度(precision),E指明小数点在B进制数据中的位置,因而E和B决定了浮点数的表示范围(range),浮点数的符号(Sign)是单独考虑,表示为: 符号位(S) 阶码(E) 尾数(M) 二、定点数与浮点数的对比 为了简单的把问题描述清楚,这里都是十进制数字举例。 (1)表示的精度与范围不同 例如,我们用4个十进制数来表达一个数字。对于定点数(这里以定点整数为例),我们表示区间[0000,9999]中的任何一个数字,但是如果我们要想表示类似1234.3的数值就无能为力了,因为此时的表示精度为1/100=1;如果采用浮点数来表示(以归整的科学记数法,即小数点前有一位有效位,为例),则可以表示[0.000,9.999]之间的任何一个数字,表示的精度为1/103=0.001,精度比上一种方式提高了很多,但是表示的范围却小了很多。 也就是说一般的,定点数表示的精度较低,但表示的数值范围较大;而浮点数恰恰相反。 (2)计算机中运算的效率不同 一般说来,定点数的运算在计算机中实现起来比较简单,效率较高;而浮点数的运算在计算机中实现起来比较复杂,效率相对较低。 (3)硬件依赖性 一般说来,只要有硬件提供运算部件,就会提供定点数运算的支持,但不一定支持浮点数运算,如有的很多嵌入式开发板就不提供浮点运算的支持。 三、IEEE754标准及存储格式 1. IEEE754标准 为便于软件的移植,浮点数的表示格式应该有统一标准。1985年IEEE(Institute of Electrical and Electronics Engineers)提出了IEEE754标准。该标准规定基数为2,阶码E用移码表示,尾数M用原码表示,根据原码的规格化方法,最高数字位总是1,该标准将这个1缺省存储,使得尾数的表示精度多了一位。实数的IEEE754标准的浮点数格式为: 类型 存储位数 总位数 偏移值 (offset) 数符(S) 阶码(E) 尾数(M) 短实数(float) 1 8 23 32 127 长实数(double) 1 11 52 64 1023 说明: 1) 约定小数点左边隐含有一位1,实际上使尾数的有效位数为24位,即尾数为1.M 2) 偏移值 = 2 ^ (尾数位数 - 1) – 1。必须从指数中减去偏移值,才能确定有符号指数的实际值。 3) 讨论float型: E = 0, M = 0 , 若 S = 0, 则N = 0; S = 1, 则 N = -0。-0可以表示一个很小的数,小到在单精度格式中不能用数字和指数来表示。尽管如此,它们仍然小于0。 E = 0, M ≠ 0, 则数是有效的,但不是规格化数, N = (-1) ^ S × 2 ^ ( - 127) × (0.M) E = 255, M = 0, 则数为正或负无穷大, 这取决于S. E = 255, M ≠ 0, 则N不是一个数, 表示为NaN. E = 1 ~ 254, 则N = (-1) ^ S × 2 ^ (E - 127) × (1.M), 为规格化数. 举例说明,如3.24x103,则对应的部分为,Sign为0,3为指数部分(注意计算机里面存储的不是3,这里仅仅为了说明),3.24为尾数。 2.存储格式 我们知道,计算机只认识0和1,那么到底一个浮点数值在计算机存储介质中是如何存储的呢? 在存储时,一个浮点数所占用的存储空间被划分为两部分,分别存放尾数和阶码。尾数部分通常使用定点小数方式,阶码则采用定点整数方式。尾数的长度影响该数的精度,而阶码则决定该数的表示范围。 例如,我们要想知道浮点类型的值4.25在计算机硬盘中存储的庐山真面目,那么首先把4.25转换成二进制的表达方式,即100.01,再详细点,变成1.0001x22,好了,对号入座吧。 Sign=0; Exponent(bias)=2+127=129 (偏移量为127,就是直接加上个127了); Mantissa=1.0001-1.0=0001(规格化后,小数点前总是整数1,所以省略不写了,即尾数部分不包括整数部分。) 四、定点数的加减乘除运算 简单的说,各种运算的原则就是先把待运算的数据放大一定的倍数,在运算的过程中使用的放大的数据,在最终需要输出结果的时候再调整回去。 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。但在许多情况下,数学运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢? 这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。 数的定标有Q表示法和S表示法两种。表1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。 表1 Q表示、S表示及数值范围 Q表示 S表示 十进制数表示范围 Q15 S0.15 -1≤X≤0.9999695 Q14 S1.14 -2≤X≤1.9999390 Q13 S2.13 -4≤X≤3.9998779 Q12 S3.12 -8≤X≤7.9997559 Q11 S4.11 -16≤X≤15.9995117 Q10 S5.10 -32≤X≤31.9990234 Q9 S6.9 -64≤X≤63.9980469 Q8 S7.8 -128≤X≤127.9960938 Q7 S8.7 -256≤X≤255.9921875 Q6 S9.6 -512≤X≤511.9804375 Q5 S10.5 -1024≤X≤1023.96875 Q4 S11.4 -2048≤X≤2047.9375 Q3 S12.3 -4096≤X≤4095.875 Q2 S13.2 -8192≤X≤8191.75 Q1 S14.1 -16384≤X≤16383.5 Q0 S15.0 -32768≤X≤32767 从表1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如:16进制数2000H=8192,用Q0表示;16进制数2000H=0.25,用Q15表示。但对于DSP芯片来说,处理方法是完全相同的。 从表1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0的数值范围是-32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为 1/32768 = 0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。 浮点数与定点数的转换关系可表示为: 浮点数(x)转换为定点数( ): 定点数( )转换为浮点数(x): 例如,浮点数 x=0.5,定标 Q=15,则定点数 = ,式中 表示下取整。反之,一个用 Q=15 表示的定点数16384,其浮点数为16384×2-15 =16384/32768=0.5。
定点与浮点
最新推荐文章于 2024-06-06 13:11:58 发布