整型浮点型及字符型变量的使用

整型浮点型及字符型变量的使用
整型浮点型及字符型变量的使用

实验2整型浮点型及字符型变量的使用

一.实验内容:

1、熟悉多种进制形式的整型数据的输入输出。

2、通过用整型变量存储整数的阶乘,体会整型变量的用法。

3、体会输入浮点型数据时格式字符f、e和E的作用,理解浮点型数据的精度。

4、体会单精度变量与双精度变量在使用scanf函数赋值时的差别。

5、理解字符型数据与其它数据混合输入时需注意的问题。

二.实验目的及要求:

1、掌握整型浮点型及字符型变量的使用方法。

2、能正确识别源文件中常见的错误。

三.实验重点及难点:

1、熟练掌握C语言数据类型(整型浮点型及字符型)变量的使用及对应的格式控制符。四.实验步骤:

1. 分析下面程序的输出。

#include

void main( )

{

short i;

i = 1*2*3*4*5*6;

printf("6!=%hd\n", i);

1

i = i * 7;

printf("7!=%hd\n", i);

i = i * 8;

printf("8!=%hd\n", i);

i = i * 9;

printf("9!=%hd\n", i);

}

程序的输出结果为:

分析:

语句i = 1*2*3*4*5*6;使变量i赋值为1到6的连乘积,即6的阶乘。语句i=i*7;执行时,先让变量i乘以7,然后乘积又存储到变量i中了,即变量i保存了7的阶乘。当用变量i保存8的阶乘时,变量i的值已经变成了负值,因为?

答:内存溢出,short为短整型,只有两个字节的内存,取值范围为-32768~32767。

1)把程序中变量i的类型变为unsigned short,程序中应怎样正确输出变量i的值?变量i能正确保存哪个整数的阶乘?

2

答:能正确保证8的阶乘

2)把程序中变量i的类型变为long时呢?

答:能正确保证9的阶乘

3)把程序中变量i的类型变为unsigned long时呢?

能正确保证9的阶乘

2. 分析下面程序中每条语句的作用。

#include

void main()

{

int m, n; 声明整型变量或函数m,n

printf("请输入一个三位的正整数!\n"); 输出“请输入一个三位正整数!”并换行 scanf("%d", &n); 输入一个数并定义为n

3

m = n % 10; 将n除以10求余并将此值赋给m n = n / 10; n除以10并将值赋给n

printf("%d",m); 输出m的值

m = n % 10; 将n除以10求余并将此值赋给m n = n / 10; n除以10并将值赋给n

printf("%d",m); 输出m的值

m = n % 10; 将n除以10求余并将此值赋给m n = n / 10; n除以10并将值赋给n

printf("%d",m); 输出m的值

}

当用户输入789时,程序的输出结果是什么?

3 .#include

4

void main( )

{

float fa, fb, fc, fd;

fa = 2.3;

fb = -0.0023;

fc = 2.3e5;

fd = 0.00023E-2;

printf("%f,%e,%E\n", fa, fa, fa);

printf("%f,%e,%E\n", fb, fb, fb);

printf("%f,%e,%E\n", fc, fc, fc);

printf("%f,%e,%E\n", fd, fd, fd); }

5

分析:

1)用格式字符串%f、%e和%E输出浮点型数据时有何特点?

答:格式字符f对应于浮点型数据的一般形式。格式字符e或E对应于浮点型数据的规范形式。2)一般形式的数据在输出时与其字面量相比有何不同?

答:默认小数点后有六位

3)指数形式的数据在输出时与其字面量相比有何不同?

答:第七位四舍五入

4.有float f=0.1;,则单精度变量f的实际值是多少呢?

#include

void main( )

{

float f=0.1;

printf("%.20f\n", f);

}

的输出为

可见,它的实际值与0.1有不小的差距。

有double df=0.1;,则双精度变量df 的实际值是多少呢?

6

当用浮点数-2.3给这两个变量赋值时,它们的实际值又会是多少呢?

5. 分析下面程序的输出。

#include

void main( )

{

char ca = '0';

char cb = 'A';

char cc = '\n';

printf("%c%c%c", ca, cb, cc);

}

7

答:“char”是用来定义字符型变量,其中ca定义字符为“0”,cb定义字符为“A”,cc定义转义序列“\n”其意思为换行。

6. 分析下面程序的输出。

#include

void main( )

{

printf("Hello!\b");

getchar( );

}

程序的输出

程序中的getchar( );语句仅为了定屏,观察printf函数的输出结果。从输出结果看,控制字符'\b'并没有删除它前面的字符,它的作用是“将输入输出光标移到前一列”。上面程序的输出中,它前面的空格字符不是消失了,而是被新的字符覆盖了。

五.实验总结:(问题及收获)

问题:在实验(1)中将short改为unsigned short和其他几个关键字后输出结果相同。后证实为相应格式符忘记更改。

收获:明白了浮点型变量的误差,整型变量的范围,printf中各种关键字的作用。

8

浮点算法转换成硬件定点算法中的问题

浮点算法转换成硬件定点算法中的问题 回北京航空航天大学唐清贵夏宇闻 引言 DSP和FPGA是信号处理工程设计领域发展最快的两个分支G目前9它们的应用非常普及9但是要开发出占用资源少9运行速度快的高质量硬件体系结构比较困难G 在通常情况下9算法的硬件实现都需要采用定点运算并考虑并行结构G 但是在实际的许多应用中9比如图像处理\语音压缩等9需要进行大量复杂的数据运算9而且对数据的精度及动态范围都要求比较高9所以9算法模型大多都以浮点数为基础G另一方面9浮点算法在硬件实现上有相当大的难度9不仅占用的系统资源较多9而且硬件运行的速度也较慢9在很多场合下不能很好地满足系统实时性的要求G因此9电子工程师为了提高系统的性能9一般都会先对浮点算法进行仔细的分析9结合工程的实际要求9综合考虑诸多因素9然后再将其转化为定点算法并通过硬件来实现G 因此9如何使转化后的算法在硬件上能正确地运行是设计开发人员特别关心的问题G解决该问题的唯一途径就是使处理后的数据保持系统要求的精度和动态范围9否则就会因为数据处理不当9使系统产生莫名奇妙的故障9从而导致系统的失败G在遇到此类问题时9务必要谨慎对待9以免造成不可估量的损失G 1浮点与定点运算的比较 在开发过程中9必须要对应用的数据精度及动态范围有清楚的认识9并在开始设计硬件结构前9先进行算法定点化的研究工作9严格按照工程设计的实际需求在数学运算上对算法进行数字定点化处理并计算验证G只有这样9才能保证最终设计的硬件体系结构产生的运算结果符合设计需求G 为了更好的说明如何成功的完成浮点算法向定点算法的转化9首先对浮点数和定点数进行简要回顾G 浮点数由三部分组成C指数部分\尾数部分和符号位9如图l所示G图l中T\l分别为指数和尾数的位宽9浮点 数据的数值U f p 表示为C U f p =(_l)S"U s"Z U e 其中9S为符号位的值9U s为尾数的数值9U e是指数的数值G在I EEE754标准中9单精度浮点指数位数为89尾数位数为Z39还有l位符号位G数据绝对值最小可以是Z.O>l O-389最大可以是Z.O>l O+389双精度浮点指数位数为l l9尾数位数为5Z9同样也有l位符号位G数据绝对值最小可以是Z.O>l O-3O89最大可以是Z.O>l O+3O8G 定点数的表示方法和浮点数相对应9数据直接用二进制表示9且小数点在数据的位置固定G和浮点数相比9它的运算简单9没有浮点数尾数对齐和归一化问题G因此9在硬件上实现以定点数为基础的算法占用的面积少\性能高9故定点运算是信号处理硬件实现中最常用的一种方式G但是9由于定点数表示的范围远远小于浮点数9所以在实现过程可能会有许多的隐患9如在运算过程中9经常会碰到溢出问题和病态方程等问题G 2精度处理策略 根据上面的分析9可以看到9浮点算法与定点算法主要的不同之处在于算法中的数据精度和动态范围G因此9只要解决了转化后由于数据的精度和动态范围减小引起的问题9那就等于解决了算法的转化问题G 目前9为了保证转化后的算法能正确地实现系统功能9对数据精度处理的方法主要有舍弃最低位和采用最大字长等G前者以损失精度来保证计算中的无溢出9但是得到的结果往往与实际值有一定的差距9从而使系统在很多情况下不能稳定地运行S后者通过应用分析找出所需数据的最大字长(该字长为运算中精度无损失条件下数据的长度)9然后再以最大字长的方式进行算法中所有数据的运算9该方法虽然保证了计算结果的正确和精度9但是它的缺点在于造成了资源的巨大浪费9限制了硬件运行速度的提高9因为实现算法中的某些运算所需的字长远远小于最大字长G最佳的转化应该是使处理后算法中的数据既能 图 1 Z OO5.lZ M icrocontrollers Embedded S y ste ms75

浮点转定点计算

一DSP定点算数运算 1 数的定标 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。如无特别说明,本书均以16位字长为例。 DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,l则表示数值为负。其余15位表示数值的大小。因此, 二进制数0010000000000011b=8195 二进制数1111111111111100b= -4 对DSP芯片而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。那么是不是说DSP芯片就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。 从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如, 16进制数2000H=8192,用Q0表示 16进制数2000H=0.25,用Q15表示 但对于DSP芯片来说,处理方法是完全相同的。 从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0 的数值范围是一32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。 浮点数与定点数的转换关系可表示为: 浮点数(x)转换为定点数(xq):xq=(int)x* 2Q 定点数(xq)转换为浮点数(x):x=(float)xq*2-Q 例如,浮点数x=0.5,定标Q=15,则定点数xq=[0.5*32768]=16384,式中[]表示下取整。反之,一个用Q=15表示的定点数16384,其浮点数为16384/2e15=16384/32768=0.5。浮点数转换为定点数时,为了降低截尾误差,在取整前可以先加上0.5。 表1.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

浮点转定点方法总结

浮点转定点方法总结 —孔德琦

目录 定点运算方法................................................ 错误!未定义书签。 数的定标 ............................................... 错误!未定义书签。 C语言:从浮点到定点 ................................. 错误!未定义书签。 加法.................................................... 错误!未定义书签。 乘法..................................................... 错误!未定义书签。 除法..................................................... 错误!未定义书签。 三角函数运算............................................ 错误!未定义书签。 开方运算................................................ 错误!未定义书签。 附录...................................................... 错误!未定义书签。 附录1:定点函数库...................................... 错误!未定义书签。 附录2:正弦和余弦表..................................... 错误!未定义书签。

DSP编程技巧之22详解浮点运算的定点编程

DSP编程技巧之22详解浮点运算的定点编程 我们使用的处理器一般情况下,要么直接支持硬件的浮点运算,比如某些带有FPU的器件,要么就只支持定点运算,此时对浮点数的处理需要通过编译器来完成。在支持硬件浮点处理的器件上,对浮点运算的编程最快捷的方法就是直接使用浮点类型,比如单精度的float来完成。但是在很多情况下,限于成本、物料等因素,可供我们使用的只有一个定点处理器时,直接使用float类型进行浮点类型的运算会使得编译器产生大量的代码来完成一段看起来十分简单的浮 点数学运算,造成的后果是程序的执行时间显著加长,且其占用的资源量也会成倍地增加,这就涉及到了如何在定点处理器上对浮点运算进行高效处理的问题。本文引用地址:https://www.360docs.net/doc/cc13825320.html,/article/263475.htm 既然是定点处理器,那么其对定点数,或者说字面意义上的“整数”进行处理的效率就会比它处理浮点类型的运算要高的多。所以在定点处理器上,我们使用定点的整数来代表一个浮点数,并规定整数位数和小数位数,从而方便地对定点数和浮点数进行转换。以一个32位的定点数为例,假设转换因子为Q,即32位中小数的位数为Q,整数位数则为31-Q(有符号数的情况),则定点数与浮点数的换算关系为:定点数=浮点数×2^Q例如,浮点数-2.0转换到Q为30的定点数时,

结果为:定点数=-2×2^30=-2147483648 32位有符号数的表示范围是:-2147483648到2147483647。如果我们把有符号定点数的最大值2147483647转换为Q为30对应的浮点数,则结果为:浮点数 2147483647/2^30=1.999999999 从上面的两个计算例子中也可以看出,在Q30格式的情况下,最大的浮点数只能表示到1.999999999,如果我们想把浮点数2.0转换为Q30的定点数,则产生了溢出,即造成了1e-9的截断误差。在此我们列出Q0到Q30对应的范围和分辨率如下表所示:如果你嫌自己计算麻烦的话,可以借助Matlab的命令来求取它们的转换,例如,在Matlab的命令窗口中输入:q = quantizer('fixed', 'ceil', 'saturate', [32 30]); FixedNum=bin2dec(num2bin(q,1.999999999)); 回车之后就可以看到1.999999999转成Q30之后的定点数了。 弄清楚了单个浮点数和定点数之间的转换关系,接下来就需要了解一下两个定点数所代表的浮点数进行运算时,是如何转换的了。根据乘法的结合律、分配率,浮点数转换之后的定点数是可以直接运算的,例如: 1. 不同Q格式的转换设有定点数Fixed1=Float1*2^Q1,如果把它用为Q2这个不同精度/表示范围的定点数来表示,则有 Fixed2=Float1*2^Q2。所以不同的Q格式直接的转换为:Fixed2=Fixed1*2^Q2/2^Q1=Fixed1*2^(Q2-Q1) 因为

浮点转定点方法总结

CII Technologies, Inc. 浮点转定点方法总结 浮点转定点方法总结 —孔德琦 1

CII Technologies, Inc. 目录 目录 定点运算方法 (3) 1.1数的定标 (3) 1.2 C语言:从浮点到定点 (4) 1.2.1 加法 (4) 1.2.2乘法 (6) 1.2.3除法 (7) 1.2.4 三角函数运算 (8) 1.2.5 开方运算 (9) 1.3附录 (10) 1.3.1 附录1:定点函数库 (10) 1.3.2附录2:正弦和余弦表 (19) 2

CII Technologies, Inc. 浮点转定点方法总结 定点运算方法 1.1 数的定标 对某些处理器而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,如何处理小数的呢?应该说,处理器本身无能为力。那么是不是就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标用Q表示法。表1.1列出了一个16位数的16种Q表示能表示的十进制数值范围和近似的精度。 Q表示精度(近似) 十进制数表示范围 Q15 0.00002 -1≤X≤0.9999695 Q14 0.00005 -2≤X≤1.9999390 Q13 0.0001 -4≤X≤3.9998779 Q12 0.0002 -8≤X≤7.9997559 Q11 0.0005 -16≤X≤15.9995117 Q10 0.001 -32≤X≤31.9990234 Q9 0.002 -64≤X≤63.9980469 Q8 0.005 -128≤X≤127.9960938 Q7 0.01 -256≤X≤255.9921875 Q6 0.02 -512≤X≤511.9804375 Q5 0.04 -1024≤X≤1023.96875 Q4 0.08 -2048≤X≤2047.9375 Q3 0.1 -4096≤X≤4095.875 Q2 0.25 -8192≤X≤8191.75 Q1 0.5 -16384≤X≤16383.5 Q0 1 -32768≤X≤32767 表1.1 Q表示、S表示及数值范围 从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如: 16进制数2000H=8192,用Q0表示 16进制数2000H=0.25,用Q15表示 从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0的数值范围是-32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为 3

浮点转定点算法

在定点的DSP或处理器中,实现一个浮点数的运算时一个非常复杂的事情,尤其是非四则运算的函数运算,例如三角函数运算,sin,cos,tan,又比如指数运算,exp,非整数的幂运算等等。用机器来实现这样复杂的运算,会花费很多的计算指令周期。在某些程度下,用定点整数去代替浮点运算,会很大程度的节省运算时间,是应用程序达到实时运算的效果。 一DSP定点算数运算 1数的定标 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。 一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。 显然,字长越长,所能表示的数的范围越大,精度也越高。如无特别说明,本书均以16位字长为例。 DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正, l则表示数值为负。其余15位表示数值的大小。因此, 二进制数0010000000000011b=8195 二进制数1111111111111100b=-4 对DSP芯片而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一 定都是整数。那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。那么是不是说 DSP芯片就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处 于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法 和S表示法两种。表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。 从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如, 16进制数2000H=8192,用Q0表示 16进制数2000H=0.25,用Q15表示 但对于DSP芯片来说,处理方法是完全相同的。 从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小, 但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0的数值范围是一32768到+32767, 其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。因此,对定点数而言, 数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想 精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑 到这一点。 浮点数与定点数的转换关系可表示为: 浮点数(x)转换为定点数(xq):xq=(int)x*2Q 定点数(xq)转换为浮点数(x):x=(float)xq*2-Q 例如,浮点数x=0.5,定标Q=15,则定点数xq=L0.5*32768J=16384,式中LJ表示下取整。反之,

浮点,simulink 定标指导,定点

Simulink代码生成系列(定点数)8 2010-04-11 21:21:41| 分类:项目4_高性能DSP | 标签: |举报 |字号大中小订阅 李会先(整理MATLAB) 关于定点数 定点数和它们的数据类型以字长、二进制小数点、有符号还是无符号为特征,SIMULINK定点软件支持整数和定点数,它们的主要区别是小数点。 一般的二进制定点数表示为: 定点数的标度 对于同等字长度,定点数的动态范围远小于浮点数,为了避免溢出和最小化量化误差,定点数需要标度,因此用如下方法来表示一个定点数。 ?V是任意精度的实数 ?是实数的近似 ?Q是一个存储值,用来编码V ?S=F 是斜率 ?B是偏差(基准) 斜率被分成两个部分:

? 确定二进制小数点,E是2的幂指数 ?F是斜率调整因子,规范化时1≤F﹤2 只有缩放标度的二进制小数 ?F=1 ?S=F = ?B=0 一个被量化的实数的标度用斜率S定义,这被严格的限制为2的幂,负的2的幂指数被称为分数长度,分数长度是二进制小数点右边的比特数。对于仅有缩放的二进制小数,定点数据类型表示为:?signed types —fixdt(1, WordLength, FractionLength) ?unsigned types —fixdt(0, WordLength, FractionLength) 整数是定点数类型的特殊情况,整数的用斜率为1直接标度,偏差为0,或者相当于分数长度为0,整数表达为: ?signed integer —fixdt(1, WordLength, 0) ?unsigned integer —fixdt(0, WordLength, 0) 斜率和偏差(基准)标度 当用斜率和偏差标度,被量化的实数的斜率S和偏差B可以使任何值,斜率必须是正数,用S和B定点数被表达为: ?fixdt(Signed, WordLength, Slope, Bias) 范围和精度

浮点运算转定点运算

与afreez一起学习DSP中浮点转定点运算 一:浮点与定点概述 1.1相关定义说明 定点数:通俗的说,小数点固定的数。以人民币为例,我们日常经常说到的如123.45¥,789.34¥等等,默认的情况下,小数点后面有两位小数,即角,分。如果小数点在最高有效位的前面,则这样的数称为纯小数的定点数,如0.12345,0.78934等。如果小数点在最低有效位的后面,则这样的数称为纯整数的定点数,如12345,78934等。 浮点数:一般说来,小数点不固定的数。比较容易的理解方式是,考虑以下我们日常见到的科学记数法,拿我们上面的数字举例,如123.45,可以写成以下几种形式: 12.345x101 1.2345 x102 0.12345 x103xi …… 为了表示一个数,小数点的位置可以变化,即小数点不固定。 1.2定点数与浮点数的对比 为了简单的把问题描述清楚,这里都是十进制数字举例,详细的分析,大家可以在后面的文章中看到。 (1)表示的精度与范围不同 例如,我们用4个十进制数来表达一个数字。对于定点数(这里以定点整数为例),我们表示区间[0000,9999]中的任何一个数字,但是如果我们要想表示类似1234.3的数值就无能为力了,因为此时的表示精度为1/100=1;如果采用浮点数来表示(以归整的科学记数法,即小数点前有一位有效位,为例),则可以表示[0.000,9.999]之间的任何一个数字,表示的精度为1/103=0.001,精度比上一种方式提高了很多,但是表示的范围却小了很多。 也就是说,一般的,定点数表示的精度较低,但表示的数值范围较大;而浮点数恰恰相反。 (2)计算机中运算的效率不同 一般说来,定点数的运算在计算机中实现起来比较简单,效率较高;而浮点数的运算在计算机中实现起来比较复杂,效率相对较低。 (3)硬件依赖性 一般说来,只要有硬件提供运算部件,就会提供定点数运算的支持(不知道说的确切否,没有听说过不支持定点数运算的硬件),但不一定支持浮点数运算,如有的很多嵌入式开发板就不提供浮点运算的支持。 1.3与DSP的关系 一般说来,DSP处理器可以分为两大类:定点与浮点。两者相比较而言,定点DSP处理器速度快,功耗低,价格也便宜;而浮点DSP则计算精度高,动态范围大。

PIC单片机运算子程序2,浮点数转换为定点整数,BCD码转换程序

4.2 3字节浮点数转换为定点整数 子程序的转换结果将采用补码表示。其转换数值范围:-32768~32767,入口条件和出口条件如下: 入口条件:ACCBHI、ACCBLO、EXPB 出口条件:ACCBHI、ACCBLO 以下为子程序的清单。由于程序所需调用的子程序和所需通用寄存器单元地址和定点数转换为浮点数子程序相同,在此省略。使用时,将前面介绍的子程序拷入此处即可。 FtoD CLRF SIGN ;清结果符号寄存器 MOVF ACCBHI,0 BTFSS ACCBHI,7 ;被转换数是否为负? GOTO D1 BSF SIGN,7 ;是,SIGN.7置1 CALL NEG_B ;被转换数取补 D1 BTFSS EXPB,7 ;被转换数为正,再判阶码为负否? GOTO D2 CLRF ACCBHI ;为负,被转换数小于1,无法用定点数表示 CLRF ACCBLO RETLW 0 D2 MOVLW .16 ;被转换数阶码减16(十进制数) SUBWF EXPB,0 BTFSS STATUS,C ;阶码小于16? GOTO D3 MOVLW 0XFF ;阶码大于等于16,置ACCB为最大,返回 MOVWF ACCBHI MOVWF ACCBLO RETLW 01 D3 CALL FTOW3 ;调用子程序将浮点数转换为定点数 BTFSC SIGN,7 ;定点数为负? CALL NEG_B ;是,取补 RETLW 0 ;否,返回 ;**************************************** FTOW3 MOVLW .15 ;EXPB=15(十进制数)? SUBWF EXPB,0 BTFSC STA TUS,Z RETLW 0 ;是,返回 BCF STATUS,C ;否,ACCB继续右移,EXPB加1 RRF ACCBHI RRF ACCBLO INCF EXPB GOTO FTOW3 ;重新判断EXPB=15? 【校验举例1】 19531(十进制) 化为十六进制数:4C4B0FH 结果:4C4BH 【校验举例2】 2622(十进制) 化为十六进制数:51F00CH

DSP浮点转定点方法总结

CII Technologies, Inc. 目录 目录 定点运算方法 (2) 1.1数的定标 (2) 1.2 C语言:从浮点到定点 (3) 1.2.1 加法 (3) 1.2.2乘法 (5) 1.2.3除法 (6) 1.2.4 三角函数运算 (7) 1.2.5 开方运算 (8) 1.3附录 (9) 1.3.1 附录1:定点函数库 (9) 1.3.2附录2:正弦和余弦表 (18)

CII Technologies, Inc. 浮点转定点方法总结 定点运算方法 1.1 数的定标 对某些处理器而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,如何处理小数的呢?应该说,处理器本身无能为力。那么是不是就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标用Q表示法。表1.1列出了一个16位数的16种Q表示能表示的十进制数值范围和近似的精度。 Q表示精度(近似) 十进制数表示范围 Q15 0.00002 -1≤X≤0.9999695 Q14 0.00005 -2≤X≤1.9999390 Q13 0.0001 -4≤X≤3.9998779 Q12 0.0002 -8≤X≤7.9997559 Q11 0.0005 -16≤X≤15.9995117 Q10 0.001 -32≤X≤31.9990234 Q9 0.002 -64≤X≤63.9980469 Q8 0.005 -128≤X≤127.9960938 Q7 0.01 -256≤X≤255.9921875 Q6 0.02 -512≤X≤511.9804375 Q5 0.04 -1024≤X≤1023.96875 Q4 0.08 -2048≤X≤2047.9375 Q3 0.1 -4096≤X≤4095.875 Q2 0.25 -8192≤X≤8191.75 Q1 0.5 -16384≤X≤16383.5 Q0 1 -32768≤X≤32767 表1.1 Q表示、S表示及数值范围 从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如: 16进制数2000H=8192,用Q0表示 16进制数2000H=0.25,用Q15表示 从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0的数值范围是-32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为

浮点数定点运算

DSP芯片的定点运算 1.数的定标 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。如无特别说明,本书均以16位字长为例。DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,1则表示数值为负。其余15位表示数值的大小。因此 二进制数0010000000000011b=8195 二进制数1111111111111100b=-4 对DSP芯片而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学_运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。那么是不是说DSP芯片就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。表3.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。 从表3.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如: 16进制数2000H=8192,用Q0表示 16进制数2000H=0.25,用Q15表示 但对于DSP芯片来说,处理方法是完全相同的。 从表3.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。 表3.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

浮点运算转定点运算

浮点运算转定点运算 一DSP定点算数运算 1 数的定标 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。如无特别说明,本书均以16位字长为例。 DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,l则表示数值为负。其余15位表示数值的大小。因此, 二进制数0010000000000011b=8195 二进制数1111111111111100b= -4 对DSP芯片而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。那么是不是说DSP芯片就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。 从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如, 16进制数2000H=8192,用Q0表示 16进制数2000H=0.25,用Q15表示 但对于DSP芯片来说,处理方法是完全相同的。 从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0 的数值范围是-32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。 浮点数与定点数的转换关系可表示为: 浮点数(x)转换为定点数(xq):xq=(int)x* 2Q 定点数(xq)转换为浮点数(x):x=(float)xq*2-Q 例如,浮点数x=0.5,定标Q=15,则定点数xq=L0.5*32768J=16384,式中LJ表示下取整。反之,一个用Q=15表示的定点数16384,其浮点数为16384 *2^-15=16384/32768=0.5。浮点数转换为定点数时,为了降低截尾误差,在取整前可以先加上0.5。

定点与浮点运算的比较

定点与浮点运算DSP的比较 定点运算DSP在应用中已取得了极大的成功,而且仍然是DSP应用的主体。然而,随着对DSP处理速度与精度、存储器容量、编程的灵活性和方便性要求的不断提高、自80年代中后期以来,各DSP生产厂家陆续推出了各自的32bit 浮点运算DSP。 和定点运算DSP相比,浮点运算DSP具有许多优越性: 浮点运算DSP比定点运算DSP的动态范围要大很多。定点DSP的字长每增加1bit,动态范围扩大6dB。16bit字长的动态范围为96dB。程序员必须时刻关注溢出的发生。例如,在作图像处理时,图像作旋转、移动等,就很容易产生溢出。这时,要么不断地移位定标,要么作截尾。前者要耗费大量的程序空间和执行时间,后者则很快带来图像质量的劣化。总之,是使整个系统的性能下降。在处理低信噪比信号的场合,例如进行语音识别、雷达和声纳信号处理时,也会发生类似的问题。而32bit浮点运算DSP的动态范围可以作到1536dB,这不仅大大扩大了动态范围,提高了运算精度,还大大节省了运算时间和存储空间,因为大大减少了定标,移位和溢出检查。 由于浮点DSP的浮点运算用硬件来实现,可以在单周期内完成,因而其处理速度大大高于定点DSP。这一优点在实现高精度复杂算法时尤为突出,为复杂算法的实时处理提供了保证。 32bit浮点DSP的总线宽度较定点DSP宽得多,因而寻址空间也要大得多。这一方面为大型复杂算法提供了可能、因为省的DSP目标子程序已使用到几十MB存储器或更多;另一方面也为高级语言编译器、DSP操作系统等高级工具软件的应用提供了条件。 DSP的进一步发展,必然是多处理器的应用。新型的浮点DSP已开始在通信口的设置和强化、资源共享等方面有所响应。

相关文档
最新文档